欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django中的Form表单类

程序员文章站 2023-12-21 16:03:04
...
  • 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类中实现
局部钩子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>
相关标签: form

上一篇:

下一篇: