Django 中的 Form
有两大核心功能:
Form
类的定义,可以生成相应的 HTML 表单元素,供用户输入数据。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'邮箱'})
)
在视图函数中,处理表单提交并返回相应的 JSON 响应。
pythonimport 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))
通过 ModelForm
可以简化表单和模型字段的定义,直接从模型中生成表单。
Model
和 Form
时,都需要对字段进行定义并指定类型;而通过 ModelForm
,可以省去 Form
中字段的定义,直接从模型中获取。pythonfrom 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"}),
}
Form
适合用于自定义的表单,需要手动定义字段和验证规则。ModelForm
通过与数据库模型的绑定,可以自动生成表单,简化字段的定义和验证。功能 | Form | ModelForm |
---|---|---|
字段定义 | 手动定义字段及其验证规则。 | 从模型中自动生成字段,并继承模型的验证规则。 |
数据验证 | 需要手动编写验证规则,可以使用 validators 。 | 自动继承模型中的验证规则,可以额外定义验证。 |
HTML 生成 | 使用 widgets 属性自定义表单元素的 HTML 外观。 | 也可以使用 widgets 自定义字段的表单元素。 |
保存数据 | 需要手动编写保存逻辑。 | 提供 save() 方法,直接保存数据到数据库。 |
使用场景 | 适用于自定义字段和不直接与数据库交互的表单。 | 适用于基于数据库模型进行创建、更新数据的表单。 |
本文作者:GYC
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!