注册功能: (写一个简单的注册功能,要求用户名长度不得小于6位.)

  普通方式写注册功能 

    views视图下:

  1. def register(request):
  2. error_msg=' '
  3. if request.method=='GET':
  4. username=request.POST.get('name')
  5. password=request.POST.get('upwd')
  6. if len(username)<6:
  7. error_msg='用户名长度不得小于6位.'
  8. else:
  9. return Httpresponse('注册成功.')
  10. return render(request,'register.html',{'error_msg': error_msg})

  login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册页面</title>
  6. </head>
  7. <body>
  8. <form action="/reg/" method="post">
  9. {% csrf_token %}
  10. <p>
  11. 用户名:
  12. <input type="text" name="name">
  13. </p>
  14. <p>
  15. 密码:
  16. <input type="password" name="pwd">
  17. </p>
  18. <p>
  19. <input type="submit" value="注册">
  20. <p style="color: red">{{ error_msg }}</p>
  21. </p>
  22. </form>
  23. </body>
  24. </html>

  使用form组件实现注册功能

  views视图如下:

    首先我们先定义一个MyForm类:

  1. from django import forms
  2.  
  3. class MyForm(forms.Form):
  4. name=forms.CharField( label='用户名:') #form字段的名称写的是什么,前段生成的input标签的时候,input标签的name就是什么
  5. upwd=forms.CharField( label='密码:') #label指的是在input标签前面加的文本内容

  再写一个views视图函数:

  1. #基于form组件实现注册功能
  2. def register(request):
  3. #实例化一个form对象
  4. form_obj=RegForm()
  5. if request.method==' POST ':
  6. form_obj=RegForm(data=request.POST)
  7. #既然传过来的input标签的name属性值和form类对应的字段名是一样的,所以接过来后,form就取出对应的form字段名相同的数据进行form校验
  8.  
  9. if form_obj.is_valid():
  10. return Httpresponse('注册成功!!')
  11. return render(request,'register.html',{ 'form_obj': form_obj })

  login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册2</title>
  6. </head>
  7. <body>
  8. <form action="/reg2/" method="post" novalidate autocomplete="off"> #novalidate 告诉前端form表单,不要对输入的内容做校验
  9. {% csrf_token %}
  10. #{{ form_obj.as_p }} 直接写个这个,下面的用户名和密码的标签不自己写,你看看效果
  11. <div>
  12. <label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}</label>
  13. {{ form_obj.name }} {{ form_obj.name.errors.0 }} #errors是这个字段所有的错误,我就用其中一个错误提示就可以了,再错了再提示,并且不是给你生成ul标签了,单纯的是错误文本
  14. {{ form_obj.errors }} #这是全局的所有错误,找对应字段的错误,就要form_obj.字段名
  15. </div>
  16. <div>
  17. <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}</label>
  18. {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
  19. </div>
  20. <div>
  21. <input type="submit" class="btn btn-success" value="注册">
  22. </div>
  23. </form>
  24. </body>
  25. </html>

  form常用字段与插件

  创建form类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成HTML.

  插件:

  initial  : 初始值,input框里面的默认值(初始值).

  1. class loginform(forms.Form):
  2. username=forms.CharField(
  3. min_length=6, #最小长度
  4. max_length=10, #最大长度
  5. initial ='请输入用户名' , #设置默认值
  6. )
  7.  
  8. password=forms.CharField(min_length=6,label='密码:')

  error_messages : 重写错误信息.

  1. class loginform(forms.Form):
  2. username=forms.CharField(
  3. error_messages={
  4. 'required' : '不能为空',
  5. 'invalid' :'格式错误',
  6. 'min_length': '用户名最短为8位'
  7. }
  8. )
  9. pwd=forms.CharField(label='密码')

  password :

  1. class loginform(forms.Form):
  2.   ......
  3. pwd=forms.CharField(
  4. label='密码',
  5. widget=forms.widgets.PassowrdInput(attrs={'class':'c1'},render_value=True)
  6. )

radio Select

  单选radio值为字符串

  1. class loginform(forms.Form):
  2. username=forms.CharField(
  3. min_length=8,
  4. ......
  5. )
  6.  
  7. gender=forms.fields.ChoiceField(
  8. choices=((1,'男'),(2,'女'),(3,'嘻嘻嘻')),
  9. label='性别:',
  10. initial=-------,
  11. widget=forms.widgets.RadioSelect()
  12. )

  单选select

  1. class loginform(forms.Form):
  2. hobby=forms.fields.ChoiceField(
  3. choices=((1,'篮球'),(2,'足球'),(3,'乒乓球')),
  4. label='爱好:',
  5. initial='------',
  6. )

  多选select

  1. class loginform(forms.Form):
  2. ......
  3. hobby=forms.Fields.MultipleChoiceField(
  4. choices=((1,'篮球'),(2,'足球'),(3,'乒乓球')),
  5. label='爱好:',
  6. widget=forms.widgets.SelectMultiple()
  7. )

  单选CheckBox

  1. class loginform(forms.Form):
  2. ...
  3. keep=forms.fields.ChoiceField(
  4. label='是否记住密码',
  5. initial='Checked',
  6. widget=forms.widgets.CheckBoxInput()

  多选CheckBox

  1. class loginform(forms.Form):
  2. ......
  3. hobby=forms.Fields.MultipleChoiceField(
  4. choices=((1,'篮球'),(2,'足球'),(3,'乒乓球')),
  5. label='爱好:',
  6. widget=forms.widgets.CheckboxSelectMultiple()
  7. )

  form 所有内置字段

  内置字段:

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

  自定义验证函数

  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. # 使用自定义验证规则
  24. phone = fields.CharField(validators=[mobile_validate, ],
  25. error_messages={'required': '手机不能为空'},
  26. widget=widgets.TextInput(attrs={'class': "form-control",
  27. 'placeholder': u'手机号码'}))
  28.  
  29. email = fields.EmailField(required=False,
  30. error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
  31. widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

Hook钩子方法

局部钩子

  我们在form类中定义clean_字段名()方法,就能够实现对特定字段进行校验

  1. class loginform(forms.Form):
  2. username=forms.CharField(
  3. min_length=5,
  4. label='用户名:',
  5. initial='默认值',
  6. error_messages={
  7. 'required': '不能为空',
  8. 'invalid': '格式错误',
  9. 'min_length':'用户名最短为8位'},
  10. widget=forms.widgets.TextInput(attrs={'class':'form-control'})
  11. )
  12.  
  13. def clean_username(self):
  14. value=self.cleaned_data.get('username')
  15. if '666' in value:
  16. raise ValidationError('666翻了')
  17.  
  18. else:
  19. return value

  全局钩子

  我们在form类中定义clean()方法,就能实现对字段进行全局校验,字段全部验证完毕,局部钩子也全部执行完毕之后,执行这个全局钩子校验.

  1. class loginform(forms.Form):
  2. ......
  3. password = forms.CharField(
  4. min_length=6,
  5. label="密码",
  6. widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}, render_value=True)
  7. )
  8. re_password = forms.CharField(
  9. min_length=6,
  10. label="确认密码",
  11. widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}, render_value=True)
  12. )
  13. ...
  14. # 定义全局的钩子,用来校验密码和确认密码字段是否相同,执行全局钩子的时候,cleaned_data里面肯定是有了通过前面验证的所有数据
  15. def clean(self):
  16. password_value = self.cleaned_data.get('password')
  17. re_password_value = self.cleaned_data.get('re_password')
  18. if password_value == re_password_value:
  19. return self.cleaned_data #全局钩子要返回所有的数据
  20. else:
  21. self.add_error('re_password', '两次密码不一致') #在re_password这个字段的错误列表中加上一个错误,并且clean_data里面会自动清除这个re_password的值,所以打印clean_data的时候会看不到它
  22. raise ValidationError('两次密码不一致')

modelform组件

  1. from django import forms
  2.  
  3. class RbForms(forms.modelform):
  4. class Meta:
  5. model=models.Role
  6. fields='__all__'
  7. exclude=[xxx,xxx]
  8. widgets={
  9. 'name': forms.TextInput(attrs={'class': 'form-control'})
  10. }
  11. class BSForm(forms.ModelForm):
  12. def __init__(self, *args, **kwargs):
  13. super().__init__(*args, **kwargs)
  14. for field in self.fields.values():
  15. field.widget.attrs.update({"class": "form-control"})

在写别的具体的form的时候只需要继承这个BSForm就可以啦

  1. class HostForm(BSForm):
  2. class Meta:
  3. model = models.Host
  4. fields = "__all__"
  5.  
  6. def clean_hostip(self):
  7. hostip = self.cleaned_data['hostip']
  8. host = models.Host.objects.filter(hostip=hostip)
  9. if host.count() == 0:
  10. return hostip
  11. elif host.count() != 0 and hostip == self.instance.hostip:
  12. return hostip
  13. else:
  14. raise forms.ValidationError("ip地址已存在,请重新输入.")

day063 form 和modelform组件的更多相关文章

  1. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  2. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  3. Django之Form与ModelForm组件

    Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...

  4. day 64 Django基础十之Form和ModelForm组件

    Django基础十之Form和ModelForm组件   本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...

  5. Django之 Form和ModelForm组件

    01-Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用 ...

  6. Django Form和ModelForm组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  7. Django基础十之Form和ModelForm组件

    一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...

  8. Form和ModelForm组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  9. 12.Django基础十之Form和ModelForm组件

    一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...

随机推荐

  1. C# Tuple<T1,T2....T>元组的使用

    1) 先说组元:一个数据结构,由通过逗号分割的,用于传递给一个程序或者操作系统的一系列值的组合. NET Framework 直接支持一至七元素的元组 Tuple<T1> Tuple< ...

  2. 测试Oracle统计信息的导出导入

    背景:有时我们会希望可以对Oracle的统计信息整体进行导出导入.比如在数据库迁移前后,希望统计信息保持不变;又比如想对统计信息重新进行收集,但是担心重新收集的结果反而引发性能问题,想先保存当前的统计 ...

  3. appium元素获取

    查看安卓手机的界面元素: 1.打开模拟器: 2.启动服务: 在cmd 输入:  adb connect 127.0.0.1:62001  回车 可以输入 adb devices 查看启动状态 3.在a ...

  4. input[type = 'date']标签。

    1.首先调用浏览器自带时间控件,input的type属性有以下几种写法: type=’date’ //显示年.月.日 type=‘month’//显示年.月 type=‘week’//显示年.周 ty ...

  5. visio studio删除空行

    一.Ctrl+H 打开替换框 二.在替换框中的源中输入 ^(?([^\r\n])\s)*\r?$\r?\n

  6. nmon监控数据分析

    性能测试中,各个服务器资源占用统计分析是一个很重要的组成部分,通常我们使用nmon这个工具来进行监控以及监控结果输出. 一. 在监控阶段使用类似下面的命令 ./nmon -f write_3s_20v ...

  7. Linux统计文件中单词出现的次数

    grep -E "\b[[:alpha:]]+\b"  /etc/fstab  -o | sort | uniq -c 或 awk '{for(i=1;i<NF;i++){c ...

  8. Google advertiser api开发概述——入门指南

    使用入门 AdWords API 可让应用直接与 AdWords 平台互动,大幅提高管理大型或复杂 AdWords 帐号和广告系列的效率.一些典型的用例包括: 自动帐号管理 自定义报告 基于产品目录的 ...

  9. C# ToLookup

    下文参考翻译自: C#/.NET Little Wonders: The ToLookup() LINQ Extension Method 故事的背景 让我们先来创建一个简单的类来表示产品,产品有ID ...

  10. 激活Pychram

    最近更新了Intellij IDEA到2018.1.5之后,使用之前的授权服务器(http://idea.imsxm.com)会提示Outdated License Server Detected,大 ...