天天看点

Django中的Form表单类

  • Django的Form类

    Django表单系统的核心组件是Form类.它与Django模型描述对象的逻辑结构、行为以及它呈现给我们内容的形式的方式大致相同, Form 类描述一张表单并决定它如何工作及呈现。

    类似于模型类的字段映射到数据库字段的方式,表单类的字段会映射到HTML表单的 元素。

    ModelForm 通过 Form 映射模型类的字段到HTML表单的 元素,Django admin就基于此。

  • 实例化、处理和渲染表单

    当我们处理表单时,我们一般在视图中实例化它。

    当我们实例化表单时,我们可以选择让它为空或者对它预先填充(依据请求是post还是get)

  1. 来自已保存的模型实例的数据(例如在管理编辑表单的情况下)
  2. 我们从其他来源获取的数据
  3. 从前面一个HTML 表单提交过来的数据
  • 实操
  1. 构建一个表单
在对应的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': '默认显示'}))
常用的一些参数
           
  1. clean验证函数 不用在view视图验证可直接在form类中实现
form类的运行顺序是init,clean,validte,save
其中clean和validate会在form.is_valid()方法中被先后调用 所以不用在视图函数中调用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
           
  1. 构造实例对象,传入模板渲染
#判断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)
 
           
  1. 模板显示
{# 不设置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>