Form(from django import forms)

简短理解:后端提供了一个类:from django import forms,继承此类定义子类。子类中定义和form表单中提交到name名称一样的字段。django就可以帮做验证。验证后返回三个信息:是否通过;所有正确信息;所有错误信息。

例如:

自己写前端html后端Form类进行验证

小试牛刀

views.py

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4.  
  5. class MyForm(Form):
  6. user = fields.CharField(
  7. widget=widgets.TextInput(attrs={'id': 'i1', 'class': 'c1'})
  8. )
  9.  
  10. gender = fields.ChoiceField(
  11. choices=((1, '男'), (2, '女'),),
  12. initial=2,
  13. widget=widgets.RadioSelect
  14. )
  15.  
  16. city = fields.CharField(
  17. initial=2,
  18. widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
  19. )
  20.  
  21. pwd = fields.CharField(
  22. widget=widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
  23. )

views.py 函数处理

  1. from django.shortcuts import render, redirect
  2. from .forms import MyForm
  3.  
  4. def index(request):
  5. if request.method == "GET":
  6. obj = MyForm()
  7. return render(request, 'index.html', {'form': obj})
  8. elif request.method == "POST":
  9. obj = MyForm(request.POST, request.FILES)
  10. if obj.is_valid():
  11. values = obj.clean()
  12. print(values)
  13. else:
  14. errors = obj.errors
  15. print(errors)
  16. return render(request, 'index.html', {'form': obj})
  17. else:
  18. return redirect('http://www.google.com')

对应html

  1. <form action="/" method="POST" enctype="multipart/form-data">
  2. <p>{{ form.user }} {{ form.user.errors }}</p>
  3. <p>{{ form.gender }} {{ form.gender.errors }}</p>
  4. <p>{{ form.city }} {{ form.city.errors }}</p>
  5. <p>{{ form.pwd }} {{ form.pwd.errors }}</p>
  6. <input type="submit"/>
  7. </form>

  1. <form method="POST" enctype="multipart/form-data">
  2. {% csrf_token %}
  3.  
  4. {{ form.xxoo.label }}
  5. {{ form.xxoo.id_for_label }}
  6. {{ form.xxoo.label_tag }}
  7. {{ form.xxoo.errors }}
  8. <p>{{ form.user }} {{ form.user.errors }}</p>
  9. <input type="submit" />
  10. </form>

其它html标签

Form对象验证POST请求

1、Django内置字段如下:

  1. Field
  2. required=True, 是否允许为空
  3. widget=None, HTML插件
  4. label=None, 用于生成Label标签或显示内容
  5. initial=None, 初始值
  6. help_text='', 帮助信息(在标签旁边显示)
  7. error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
  8. show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
  9. validators=[], 自定义验证规则
  10. localize=False, 是否支持本地化
  11. disabled=False, 是否可以编辑
  12. label_suffix=None Label内容后缀
  13.  
  14. CharField(Field)
  15. max_length=None, 最大长度
  16. min_length=None, 最小长度
  17. strip=True 是否移除用户输入空白
  18.  
  19. IntegerField(Field)
  20. max_value=None, 最大值
  21. min_value=None, 最小值
  22.  
  23. FloatField(IntegerField)
  24. ...
  25.  
  26. DecimalField(IntegerField)
  27. max_value=None, 最大值
  28. min_value=None, 最小值
  29. max_digits=None, 总长度
  30. decimal_places=None, 小数位长度
  31.  
  32. BaseTemporalField(Field)
  33. input_formats=None 时间格式化
  34.  
  35. DateField(BaseTemporalField) 格式:2015-09-01
  36. TimeField(BaseTemporalField) 格式:11:12
  37. DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
  38.  
  39. DurationField(Field) 时间间隔:%d %H:%M:%S.%f
  40. ...
  41.  
  42. RegexField(CharField)
  43. regex, 自定制正则表达式
  44. max_length=None, 最大长度
  45. min_length=None, 最小长度
  46. error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'}
  47.  
  48. EmailField(CharField)
  49. ...
  50.  
  51. FileField(Field)
  52. allow_empty_file=False 是否允许空文件
  53.  
  54. ImageField(FileField)
  55. ...
  56. 注:需要PIL模块,pip3 install Pillow
  57. 以上两个字典使用时,需要注意两点:
  58. - form表单中 enctype="multipart/form-data"
  59. - view函数中 obj = MyForm(request.POST, request.FILES)
  60.  
  61. URLField(Field)
  62. ...
  63.  
  64. BooleanField(Field)
  65. ...
  66.  
  67. NullBooleanField(BooleanField)
  68. ...
  69.  
  70. ChoiceField(Field)
  71. ...
  72. choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),)
  73. required=True, 是否必填
  74. widget=None, 插件,默认select插件
  75. label=None, Label内容
  76. initial=None, 初始值
  77. help_text='', 帮助提示
  78.  
  79. ModelChoiceField(ChoiceField)
  80. ... django.forms.models.ModelChoiceField
  81. queryset, # 查询数据库中的数据
  82. empty_label="---------", # 默认空显示内容
  83. to_field_name=None, # HTML中value的值对应的字段
  84. limit_choices_to=None # ModelForm中对queryset二次筛选
  85.  
  86. ModelMultipleChoiceField(ModelChoiceField)
  87. ... django.forms.models.ModelMultipleChoiceField
  88.  
  89. TypedChoiceField(ChoiceField)
  90. coerce = lambda val: val 对选中的值进行一次转换
  91. empty_value= '' 空值的默认值
  92.  
  93. MultipleChoiceField(ChoiceField)
  94. ...
  95.  
  96. TypedMultipleChoiceField(MultipleChoiceField)
  97. coerce = lambda val: val 对选中的每一个值进行一次转换
  98. empty_value= '' 空值的默认值
  99.  
  100. ComboField(Field)
  101. fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
  102. fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
  103.  
  104. MultiValueField(Field)
  105. PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
  106.  
  107. SplitDateTimeField(MultiValueField)
  108. input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
  109. input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
  110.  
  111. FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中
  112. path, 文件夹路径
  113. match=None, 正则匹配
  114. recursive=False, 递归下面的文件夹
  115. allow_files=True, 允许文件
  116. allow_folders=False, 允许文件夹
  117. required=True,
  118. widget=None,
  119. label=None,
  120. initial=None,
  121. help_text=''
  122.  
  123. GenericIPAddressField
  124. protocol='both', both,ipv4,ipv6支持的IP格式
  125. unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1 PSprotocol必须为both才能启用
  126.  
  127. SlugField(CharField) 数字,字母,下划线,减号(连字符)
  128. ...
  129.  
  130. UUIDField(CharField) uuid类型
  131. ...

注:UUID是根据MAC以及当前时间等创建的不重复的随机字符串

  1. >>> import uuid
  2.  
  3. # make a UUID based on the host ID and current time
  4. >>> uuid.uuid1() # doctest: +SKIP
  5. UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
  6.  
  7. # make a UUID using an MD5 hash of a namespace UUID and a name
  8. >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
  9. UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')
  10.  
  11. # make a random UUID
  12. >>> uuid.uuid4() # doctest: +SKIP
  13. UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
  14.  
  15. # make a UUID using a SHA-1 hash of a namespace UUID and a name
  16. >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
  17. UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
  18.  
  19. # make a UUID from a string of hex digits (braces and hyphens ignored)
  20. >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')
  21.  
  22. # convert a UUID to a string of hex digits in standard form
  23. >>> str(x)
  24. '00010203-0405-0607-0809-0a0b0c0d0e0f'
  25.  
  26. # get the raw 16 bytes of the UUID
  27. >>> x.bytes
  28. b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
  29.  
  30. # make a UUID from a 16-byte string
  31. >>> uuid.UUID(bytes=x.bytes)
  32. UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

2、Django内置插件:

  1. TextInput(Input)
  2. NumberInput(TextInput)
  3. EmailInput(TextInput)
  4. URLInput(TextInput)
  5. PasswordInput(TextInput)
  6. HiddenInput(TextInput)
  7. Textarea(Widget)
  8. DateInput(DateTimeBaseInput)
  9. DateTimeInput(DateTimeBaseInput)
  10. TimeInput(DateTimeBaseInput)
  11. CheckboxInput
  12. Select
  13. NullBooleanSelect
  14. SelectMultiple
  15. RadioSelect
  16. CheckboxSelectMultiple
  17. FileInput
  18. ClearableFileInput
  19. MultipleHiddenInput
  20. SplitDateTimeWidget
  21. SplitHiddenDateTimeWidget
  22. SelectDateWidget

常用选择插件

  1. # 单radio,值为字符串
  2. # user = fields.CharField(
  3. # initial=2,
  4. # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
  5. # )
  6.  
  7. # 单radio,值为字符串
  8. # user = fields.ChoiceField(
  9. # choices=((1, '上海'), (2, '北京'),),
  10. # initial=2,
  11. # widget=widgets.RadioSelect
  12. # )
  13.  
  14. # 单select,值为字符串
  15. # user = fields.CharField(
  16. # initial=2,
  17. # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
  18. # )
  19.  
  20. # 单select,值为字符串
  21. # user = fields.ChoiceField(
  22. # choices=((1, '上海'), (2, '北京'),),
  23. # initial=2,
  24. # widget=widgets.Select
  25. # )
  26.  
  27. # 多选select,值为列表
  28. # user = fields.MultipleChoiceField(
  29. # choices=((1,'上海'),(2,'北京'),),
  30. # initial=[1,],
  31. # widget=widgets.SelectMultiple
  32. # )
  33.  
  34. # 单checkbox
  35. # user = fields.CharField(
  36. # widget=widgets.CheckboxInput()
  37. # )
  38.  
  39. # 多选checkbox,值为列表
  40. # user = fields.MultipleChoiceField(
  41. # initial=[2, ],
  42. # choices=((1, '上海'), (2, '北京'),),
  43. # widget=widgets.CheckboxSelectMultiple
  44. # )

在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

方式一:

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4. from django.core.validators import RegexValidator
  5.  
  6. class MyForm(Form):
  7.  
  8. user = fields.ChoiceField(
  9. # choices=((1, '上海'), (2, '北京'),),
  10. initial=2,
  11. widget=widgets.Select
  12. )
  13.  
  14. def __init__(self, *args, **kwargs):
  15. super(MyForm,self).__init__(*args, **kwargs)
  16. # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
  17. # 或
  18. self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')

方式二:

使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现

  1. from django import forms
  2. from django.forms import fields
  3. from django.forms import widgets
  4. from django.forms import models as form_model
  5. from django.core.exceptions import ValidationError
  6. from django.core.validators import RegexValidator
  7.  
  8. class FInfo(forms.Form):
  9. authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
  10. # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())

自定义验证规则

方式一:

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4. from django.core.validators import RegexValidator
  5.  
  6. class MyForm(Form):
  7. user = fields.CharField(
  8. validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
  9. )

方式二:

  1. import re
  2. from django.forms import Form
  3. from django.forms import widgets
  4. from django.forms import fields
  5. from django.core.exceptions import ValidationError
  6.  
  7. # 自定义验证规则
  8. def mobile_validate(value):
  9. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  10. if not mobile_re.match(value):
  11. raise ValidationError('手机号码格式错误')
  12.  
  13. class PublishForm(Form):
  14.  
  15. title = fields.CharField(max_length=20,
  16. min_length=5,
  17. error_messages={'required': '标题不能为空',
  18. 'min_length': '标题最少为5个字符',
  19. 'max_length': '标题最多为20个字符'},
  20. widget=widgets.TextInput(attrs={'class': "form-control",
  21. 'placeholder': '标题5-20个字符'}))
  22. # 使用自定义验证规则
  23. phone = fields.CharField(validators=[mobile_validate, ],
  24. error_messages={'required': '手机不能为空'},
  25. widget=widgets.TextInput(attrs={'class': "form-control",
  26. 'placeholder': u'手机号码'}))
  27.  
  28. email = fields.EmailField(required=False,
  29. error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
  30. widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

django2.1 Form验证大体流程:obj.is_vaild-->  self.is_bound-->  self.errors-->  self.full_clean-->  self._clean_fields-->  self._clean_form-->  slef._post_clean

  1. """
  2. obj.is_vaild: 入口中self.is_bound代表数据不能为None和字段也是不能为None
  3.  
  4. self._errors: 默认是None,必执行self.full_clean()方法-->self._errors = ErrorDict(),self.cleaned_data = {},空字典赋值给错误信息

  5. 接着执行self._clean_fields() -->循环self.fields.items() 拿到字段名字和field正则匹配的规则,初步验证开始拿到用户提交的数据跟正则匹配,
    ----->重点环节(反射if hasattr(self, 'clean_%s' % name),这里就可以根据定义的字段名字,我们可以开始自己定义这个函数自定义验证)如果没成功验证必须抛出ValidationError这个错(局部钩子)
  6.  
  7. 接着执行self._clean_form() ---->self.clean()(返回self.cleaned_data)什么事都没干,这里又是一个钩子,我们自己定义可以对整个字段进行验证 ,否则报错抛出必须是ValidationError(全局钩子)
  8.  
  9. 接着执行self._post_clean()----->直接pass了又是一个钩子,这里还可以再一次的进行验证,可以和self.clean()一样
  10. """

方法三:自定义方法clean_字段名 (验证后的钩子)

  1. from django import forms
  2. from django.forms import fields
  3. from django.forms import widgets
  4. from django.core.exceptions import ValidationError
  5. from django.core.validators import RegexValidator
  6.  
  7. class FInfo(forms.Form):
  8. username = fields.CharField(max_length=5,
  9. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )
  10. email = fields.EmailField()
  11.  
  12. def clean_username(self):
  13. """
  14. Form中字段中定义的格式匹配完之后,执行此方法进行验证
  15. :return:
  16. """
  17. value = self.cleaned_data['username']
  18. if "666" in value:
  19. raise ValidationError('666已经被玩烂了...', 'invalid')
  20. return value

方式四:同时生成多个标签进行验证

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4.  
  5. from django.core.validators import RegexValidator
  6.  
  7. ############## 自定义字段 ##############
  8. class PhoneField(fields.MultiValueField):
  9. def __init__(self, *args, **kwargs):
  10. # Define one message for all fields.
  11. error_messages = {
  12. 'incomplete': 'Enter a country calling code and a phone number.',
  13. }
  14. # Or define a different message for each field.
  15. f = (
  16. fields.CharField(
  17. error_messages={'incomplete': 'Enter a country calling code.'},
  18. validators=[
  19. RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
  20. ],
  21. ),
  22. fields.CharField(
  23. error_messages={'incomplete': 'Enter a phone number.'},
  24. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
  25. ),
  26. fields.CharField(
  27. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
  28. required=False,
  29. ),
  30. )
  31. super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,
  32. **kwargs)
  33.  
  34. def compress(self, data_list):
  35. """
  36. 当用户验证都通过后,该值返回给用户
  37. :param data_list:
  38. :return:
  39. """
  40. return data_list
  41.  
  42. ############## 自定义插件 ##############
  43. class SplitPhoneWidget(widgets.MultiWidget):
  44. def __init__(self):
  45. ws = (
  46. widgets.TextInput(),
  47. widgets.TextInput(),
  48. widgets.TextInput(),
  49. )
  50. super(SplitPhoneWidget, self).__init__(ws)
  51.  
  52. def decompress(self, value):
  53. """
  54. 处理初始值,当初始值initial不是列表时,调用该方法
  55. :param value:
  56. :return:
  57. """
  58. if value:
  59. return value.split(',')
  60. return [None, None, None]

初始化数据

在Web应用程序中开发编写功能时,时常用到获取数据库中的数据并将值初始化在HTML中的标签上。

views.py

  1. # Form
  2.  
  3. from django.forms import Form
  4. from django.forms import widgets
  5. from django.forms import fields
  6. from django.core.validators import RegexValidator
  7.  
  8. class MyForm(Form):
  9. user = fields.CharField()
  10.  
  11. city = fields.ChoiceField(
  12. choices=((1, '上海'), (2, '北京'),),
  13. widget=widgets.Select
  14. )
  15.  
  16. # View
  17. from django.shortcuts import render, redirect
  18. from .forms import MyForm
  19.  
  20. def index(request):
  21. if request.method == "GET":
  22. values = {'user': 'root', 'city': 2}
  23. obj = MyForm(values)
  24.  
  25. return render(request, 'index.html', {'form': obj})
  26. elif request.method == "POST":
  27. return redirect('http://www.google.com')
  28. else:
  29. return redirect('http://www.google.com')

html

  1. <form method="POST" enctype="multipart/form-data">
  2. {% csrf_token %}
  3. <p>{{ form.user }} {{ form.user.errors }}</p>
  4. <p>{{ form.city }} {{ form.city.errors }}</p>
  5.  
  6. <input type="submit"/>
  7. </form>

返回值详解:

 verify_obj = MyFm(request.POST)

django中的Form一般有两种功能:

  • 生成html标签
  • 验证用户输入内容

Form 对象生成html标签写法

views.py

  1. from django.shortcuts import render, HttpResponse
  2. from django.views import View
  3.  
  4. # Create your views here.
  5. from django import forms
  6.  
  7. # 用来验证前端post提交过来数据的类
  8. class MyFm(forms.Form):
  9. username = forms.CharField()
  10. pwd = forms.CharField()
  11. email = forms.EmailField()
  12.  
  13. # 请求处理
  14. class FormTest(View):
  15. def get(self, request):
  16. verify_obj = MyFm()
  17. return render(request, 'fm.html', {'verify_obj':verify_obj})

fm.html

  1. <form action="/formtest/" method="post">
  2. {% csrf_token %}
  3. <p>{{ verify_obj.username }} {{ verify_obj.errors.username.0 }}</p>
  4. <p>{{ verify_obj.pwd }} {{ verify_obj.errors.pwd.0 }}</p>
  5. <p>{{ verify_obj.email }} {{ verify_obj.errors.email.0 }}</p>
  6. <input type="submit" value="提交">
  7. </form>

django渲染后html

  1. <form action="/formtest/" method="post">
  2. <input type="hidden" name="csrfmiddlewaretoken" value="WhvU9JWIRIuk8Mjq0JJ1xCnId1ek6Rbee8kVgzyA0oHhUSIK3qZPu76opft70DPa">
  3. <p><input type="text" name="username" required id="id_username"> </p>
  4. <p><input type="text" name="pwd" required id="id_pwd"> </p>
  5. <p><input type="email" name="email" required id="id_email"> </p>
  6. <input type="submit" value="提交">
  7. </form>

Form中 自定义中文错误提示信息

  1. error_messages= {'错误类型':'中文提示字符串'}

views.py

  1. # 用来验证前端post提交过来数据的类
  2. class MyFm(forms.Form):
  3. username = forms.CharField(error_messages={'required':'用户名不允许为空'})
  4. pwd = forms.CharField(
  5. max_length=16,
  6. min_length=8,
  7. error_messages={'required': '密码不能为空', 'min_length': '密码长度不能小于8', 'max_length': '密码长度不能大于16'}
  8. )
  9. email = forms.EmailField(error_messages={'required': '邮箱不能为空', 'invalid': '邮箱格式错误'})
  1. # 请求处理
  2. class FormTest(View):
  3. def get(self, request):
  4. verify_obj = MyFm()
  5. return render(request, 'fm.html', {'verify_obj':verify_obj})
  6. def post(self, request):
  7. # 获取所有数据
  8. # 每条数据请求的验证
  9. # 成功显示正确信息
  10. # 失败,给出错误提示
  11. # 验证时将request.POST 传递给验证类,实例化验证对象
  12. verify_obj = MyFm(request.POST)
  13.  
  14. verify_result = verify_obj.is_valid() # 验证是否通过,返回True/False(所验证的字段内置了相关正则表达式,然后执行clean_字段,clean(__all__),post_clean)
  15. post_dict = verify_obj.clean() # 将获取到到的key value 转换为字典 必须在执行is_valid()以后调用
  16. cleaned_data = verify_obj.cleaned_data # 将获取到到的符合要求的信息(也是字典) 必须在执行is_valid()以后调用
  17. # 如果是注册,向数据库内写入时,直接传参给Modle **cleaned_data 即可
  18. verify_errors = verify_obj.errors # 获取所有错误信息(html标签字符串) 示例:<ul class="errorlist"><li>email<ul class="errorlist"><li>Enter a valid email address.</li></ul></li></ul>
  19. verify_errors_json = verify_obj.errors.as_json() # 获取所有错误信息(html标签字符串) 示例:{"email": [{"message": "Enter a valid email address.", "code": "invalid"}]}
  20. print(verify_errors_json) # code 表示错误类型,如无效、不许为空....message 表示对应code的提示字符串
  21. # code : invalid/required .....
  22.  
  23. # return HttpResponse(verify_result)
  24. if not verify_result:
  25. return render(request, 'fm.html', {'verify_obj': verify_obj})
  1. <form action="/formtest/" method="post">
  2. {% csrf_token %}
  3. {# <input type="text" name="username" placeholder="用户名">#}
  4. <p>{{ verify_obj.username }} {{ verify_obj.errors.username.0 }}</p>
  5. <p>{{ verify_obj.pwd }} {{ verify_obj.errors.pwd.0 }}</p>
  6. <p>{{ verify_obj.email }} {{ verify_obj.errors.email.0 }}</p>
  7. <input type="submit" value="提交">
  8. </form>

出错提示

html中也可以根据Form 对象自动生成table ul p 等html标签,直接将验证字段全部生成

  1. {{ verify_obj.as_p }}
  2. {{ verify_obj.as_ul }}
  3. <table>
  4. {{ verify_obj.as_table }}
  5. </table>

---------------------------------------------------------------------------------

原理:

Form表单本身(本例:class MyFm(forms.Form):)只做输入的值是否合法,

生成html标签是里面插件功能实现的。例如

  1. forms.CharField(xxx...)的父类 Field中的父类里面有TextInput等方法生成

自定义生成表单字段的标签类型:widgets

  1. from django import forms
  2. from django.forms import widgets
  3.  
  4. # 用来验证前端post提交过来数据的类
  5. class MyFm(forms.Form):
  6. username = forms.CharField(
  7. error_messages={'required':'用户名不允许为空'},
  8. widget=widgets.Textarea(attrs={'class': 'form_username',
  9. 'placeholder': '用户名'})
  10. )
  11. pwd = forms.CharField(
  12. max_length=16,
  13. min_length=8,
  14. error_messages={'required': '密码不能为空', 'min_length': '密码长度不能小于8', 'max_length': '密码长度不能大于16'},
  15. widget=widgets.PasswordInput(attrs={})
  16. )
  17. email = forms.EmailField(error_messages={'required': '邮箱不能为空', 'invalid': '邮箱格式错误'})

自动更新字段设置

重写父类Form 构造方法,增加更新外键字段时,选项自动更新。

  1. class UserInfoForm(forms.Form):
  2. username = fields.CharField(max_length=32)
  3. email = fields.EmailField()
  4. user_type = fields.ChoiceField(
  5. choices=models.UserType.objects.values_list('id', 'caption')
  6. )
  7.  
  8. def __init__(self, *args, **kwargs):
  9. super(UserInfoForm, self).__init__(*args, **kwargs)
  10. self.fields['user_type'].choices = models.UserType.objects.values_list('id', 'caption')

当UserType里面的数据更新的时候,生成字段会自动更新

Django的Form表单验证的更多相关文章

  1. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  2. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  3. web框架-(六)Django补充---form表单验证

    一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...

  4. Django之form表单验证顺序

    概述 django框架提供了一个forms类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证支持. 验证过程 ...

  5. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  6. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  7. 6.4-6.5 使用form表单验证,完善登录页面

    之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...

  8. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  9. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

随机推荐

  1. java内部类的调用方式

    public class DotThis { public class Inner{ public DotThis outer(){ return DotThis.this; }; } /* 1.第一 ...

  2. LOJ 2353 & 洛谷 P4027 [NOI2007]货币兑换(CDQ 分治维护斜率优化)

    题目传送门 纪念一下第一道(?)自己 yy 出来的 NOI 题. 考虑 dp,\(dp[i]\) 表示到第 \(i\) 天最多有多少钱. 那么有 \(dp[i]=\max\{\max\limits_{ ...

  3. LOJ #6207 - 米缇(杜教筛+拉格朗日插值)

    LOJ 题面传送门 首先将 \(\sigma_k(ij)\) 展开: \[\sigma_k(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j}[x\perp ...

  4. hdu 5552 Bus Routes

    hdu 5552 Bus Routes 考虑有环的图不方便,可以考虑无环连通图的数量,然后用连通图的数量减去就好了. 无环连通图的个数就是树的个数,又 prufer 序我们知道是 $ n^{n-2} ...

  5. 解决 Ubuntu 下 gedit编辑器打开文件出现中文乱码问题

    解决 Ubuntu 中 gedit编辑器打开文件出现中文乱码问题 1. 问题分析 在 windows 系统下,.txt 文件默认编码方式为 gb18030 格式的中文编码,而 gedit 默认的编码方 ...

  6. urllib的基本使用介绍

    1. urllib中urlopen的基本使用介绍 1 ### urllib中urlopen的基本使用介绍 2 3 ## urlopen的基本用法(GET请求) 4 import urllib.requ ...

  7. 19.Happy Number-Leetcode

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  8. CentOS7忘记root密码如何重置

    1.重启服务器 2.修改启动文件 3.修改密码 4.重启,测试 ①   重启服务器,按"e"键进入修改系统开机项界面 ②   修改启动文件 "ro" -> ...

  9. pyspider爬虫框架的安装和使用

    pyspider是国人binux编写的强大的网络爬虫框架,它带有强大的WebUI.脚本编辑器.任务监控器.项目管理器以及结果处理器,同时支持多种数据库后端.多种消息队列,另外还支持JavaScript ...

  10. 【Linux】CentOS下升级Python和Pip版本全自动化py脚本

    [Linux]CentOS下升级Python和Pip版本全自动化py脚本 CentOS7.6自带py2.7和py3.6 想要安装其它版本的话就要自己重新下载和编译py其它版本并且配置环境,主要是软链接 ...