编辑
2024-04-15
Python
00

目录

1. Django 中的 Form 功能
选择 Form 还是 ModelForm 取决于你的具体需求:
2. Form 示例代码
3. 视图函数处理表单提交
4. 扩展:ModelForm
ModelForm 示例代码
5. 总结
表单流程总结表格

1. Django 中的 Form 功能

Django 中的 Form 有两大核心功能:

  • 输入 HTML:通过 Form 类的定义,可以生成相应的 HTML 表单元素,供用户输入数据。
  • 验证用户输入:对用户提交的表单数据进行验证,确保符合规则。
选择 Form 还是 ModelForm 取决于你的具体需求:
  • 如果你的表单与数据库模型紧密相关,且希望简化字段的创建和数据的保存,使用 ModelForm。
  • 如果你的表单与模型无关,或者你需要更高级的自定义,那么使用 Form 更合适。

2. Form 示例代码

python
#!/usr/bin/env python # -*- coding:utf-8 -*- import re from django import forms from django.core.exceptions import ValidationError # 自定义验证函数,验证手机号格式 def mobile_validate(value): mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') if not mobile_re.match(value): raise ValidationError('手机号码格式错误') # 定义表单类 class PublishForm(forms.Form): user_type_choice = ( (0, u'普通用户'), (1, u'高级用户'), ) user_type = forms.IntegerField( widget=forms.widgets.Select(choices=user_type_choice, attrs={'class': "form-control"}) ) title = forms.CharField( max_length=20, min_length=5, error_messages={ 'required': u'标题不能为空', 'min_length': u'标题最少为5个字符', 'max_length': u'标题最多为20个字符' }, widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'标题5-20个字符'}) ) memo = forms.CharField( required=False, max_length=256, widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3}) ) phone = forms.CharField( validators=[mobile_validate], error_messages={'required': u'手机不能为空'}, widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'手机号码'}) ) email = forms.EmailField( required=False, error_messages={'required': u'邮箱不能为空', 'invalid': u'邮箱格式错误'}, widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}) )

3. 视图函数处理表单提交

在视图函数中,处理表单提交并返回相应的 JSON 响应。

python
import json from django.http import HttpResponse from .forms import PublishForm def publish(request): ret = {'status': False, 'data': '', 'error': '', 'summary': ''} if request.method == 'POST': request_form = PublishForm(request.POST) if request_form.is_valid(): request_dict = request_form.clean() print(request_dict) # 打印验证后的数据 ret['status'] = True else: error_msg = request_form.errors.as_json() ret['error'] = json.loads(error_msg) return HttpResponse(json.dumps(ret))

4. 扩展:ModelForm

通过 ModelForm 可以简化表单和模型字段的定义,直接从模型中生成表单。

  • 在使用 ModelForm 时,都需要对字段进行定义并指定类型;而通过 ModelForm,可以省去 Form 中字段的定义,直接从模型中获取。
ModelForm 示例代码
python
from django import forms from . import models class AdminModelForm(forms.ModelForm): class Meta: model = models.Admin # 绑定到 Admin 模型 # fields = '__all__' # 表示生成模型的所有字段 fields = ('username', 'email') # 只生成指定字段 widgets = { 'email': forms.PasswordInput(attrs={'class': "alex"}), }

5. 总结

  • Form 适合用于自定义的表单,需要手动定义字段和验证规则。
  • ModelForm 通过与数据库模型的绑定,可以自动生成表单,简化字段的定义和验证。

表单流程总结表格

功能FormModelForm
字段定义手动定义字段及其验证规则。从模型中自动生成字段,并继承模型的验证规则。
数据验证需要手动编写验证规则,可以使用 validators自动继承模型中的验证规则,可以额外定义验证。
HTML 生成使用 widgets 属性自定义表单元素的 HTML 外观。也可以使用 widgets 自定义字段的表单元素。
保存数据需要手动编写保存逻辑。提供 save() 方法,直接保存数据到数据库。
使用场景适用于自定义字段和不直接与数据库交互的表单。适用于基于数据库模型进行创建、更新数据的表单。
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:GYC

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!