Django中的Form表单类
程序员文章站
2023-12-21 16:03:04
...
-
Django的Form类
Django表单系统的核心组件是Form类.它与Django模型描述对象的逻辑结构、行为以及它呈现给我们内容的形式的方式大致相同, Form 类描述一张表单并决定它如何工作及呈现。
类似于模型类的字段映射到数据库字段的方式,表单类的字段会映射到HTML表单的 元素。
ModelForm 通过 Form 映射模型类的字段到HTML表单的 元素,Django admin就基于此。 -
实例化、处理和渲染表单
当我们处理表单时,我们一般在视图中实例化它。
当我们实例化表单时,我们可以选择让它为空或者对它预先填充(依据请求是post还是get)
- 来自已保存的模型实例的数据(例如在管理编辑表单的情况下)
- 我们从其他来源获取的数据
- 从前面一个HTML 表单提交过来的数据
- 实操
- 构建一个表单
在对应的app下创建form.py文件
from django import forms
class RegisterForm(forms.Form): # 自定义表单类,并继承forms.Form
email = forms.EmailField(required=true,widget=forms.EmailInput(
attrs={"class": "form-control"}))
#forms.类型() 定义对应字段的表单类型
username = forms.CharField(min_length=4, max_length=12, widget=forms.TextInput(
attrs={"class": "form-control"}))
password = forms.CharField(min_length=6, widget=forms.PasswordInput(
attrs={"class": "form-control"}))
password2 = forms.CharField(min_length=6, widget=forms.PasswordInput(
attrs={"class": "form-control"}))
valid_code = forms.CharField(widget=forms.TextInput(
attrs={"class": "form-control"}))
required是否可以为空,true表示不可以为空
min_length=4, max_length=12定义字段字符长度
widget参数用来指定字段的类型和属性widget=forms.XXinput() == input标签中type=text||password等的类型
(widget=forms.XXX(attrs={"class": "form-control", 'placeholder': '默认显示'}))
常用的一些参数
- clean验证函数 不用在view视图验证可直接在form类中实现
局部钩子clean_field用于验证单个字段,全局钩子clean用于验证两个字段
必须在构造的form类中,且必须有返回值
cleaned_data['xxx']#获取表单返回的值,
如:
#对具体form表单字段进行验证,验证成功则view视图调用时会获取到对应的值
def clean_XXX(self):(def clean_XX-必须是上方定义的字段)
xxxx = self.cleaned_data['XXX']#获取form表单中XXX的值
if xxxx DO SOMTRHIN:#进行验证
raise forms.ValidationError('邮箱已存在')#返回异常
return email#返回值
#验证两个字段,如验证用户名和对应密码是否是user
def clean():
pass
- 构造实例对象,传入模板渲染
#判断request请求是否是post
form_obj = RegisterForm(request.POST)#实例化表单
#验证提交的表单:
if form_obj.is_valid(): # 根据字段属性和验证函数进行校验
#通过验证返回 True 将表单的数据放到它的属性 cleaned_data 中。
#对数据进行进一步验证
username=reg_form.clean_username()
email=reg_form.clean_email()
#如果只是普通的渲染get请求:
form_obj = RegisterForm()
context = {}
context['reg_form'] =form_obj
return render(request, 'register.html', context)
- 模板显示
{# 不设置action跳转的动作,由后台完成,跳转 否则达不到预期效果#}
<form action="#" method="post">
{% csrf_token %}
{% for field in reg_form %}
{# 遍历所有form表单属性#}
<label for="{{ field.id_for_label }}">
{# 获取每一个form表单属性定义的字段#}
{{ field.label }}
</label>
{#获取对应form表单属性的input栏#}
{{ field }}
<p class="text-danger">
{# 对应每一个form表单属性,后台验证不通过报错提示标签#}
{{ field.errors.as_text }}
</p>
{% endfor %}
<span class="pull-left text-danger">
{#设置表单提交时的检验报错提醒#}
{{ reg_form.non_field_errors }}
</span>
<input type="submit" value="登录" class="btn btn-primary pull-right">
</form>