转载:Django之Form组件
Django的Form主要具有一下几大功能:
- 生成HTML标签
- 验证用户数据(显示错误信息)
- HTML Form提交保留上次提交数据
- 初始化页面显示内容
小试牛刀
1、创建Form类
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | fromdjango.forms importFormfromdjango.forms importwidgetsfromdjango.forms importfieldsclassMyForm(Form):    user =fields.CharField(        widget=widgets.TextInput(attrs={'id': 'i1', 'class': 'c1'})    )    gender =fields.ChoiceField(        choices=((1, '男'), (2, '女'),),        initial=2,        widget=widgets.RadioSelect    )    city =fields.CharField(        initial=2,        widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))    )    pwd =fields.CharField(        widget=widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)    ) | 
2、View函数处理
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | fromdjango.shortcuts importrender, redirectfrom.forms importMyFormdefindex(request):    ifrequest.method =="GET":        obj =MyForm()        returnrender(request, 'index.html', {'form': obj})    elifrequest.method =="POST":        obj =MyForm(request.POST, request.FILES)        ifobj.is_valid():            values =obj.clean()            print(values)        else:            errors =obj.errors            print(errors)        returnrender(request, 'index.html', {'form': obj})    else:        returnredirect('http://www.google.com') | 
3、生成HTML
<form method="POST" enctype="multipart/form-data">
{% csrf_token %} {{ form.xxoo.label }}
{{ form.xxoo.id_for_label }}
{{ form.xxoo.label_tag }}
{{ form.xxoo.errors }}
<p>{{ form.user }} {{ form.user.errors }}</p>
<input type="submit" />
</form>
其他标签有
Form类
创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
1、Django内置字段如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | Field    required=True,               是否允许为空    widget=None,                 HTML插件    label=None,                  用于生成Label标签或显示内容    initial=None,                初始值    help_text='',                帮助信息(在标签旁边显示)    error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}    show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)    validators=[],               自定义验证规则    localize=False,              是否支持本地化    disabled=False,              是否可以编辑    label_suffix=NoneLabel内容后缀CharField(Field)    max_length=None,             最大长度    min_length=None,             最小长度    strip=True是否移除用户输入空白IntegerField(Field)    max_value=None,              最大值    min_value=None,              最小值FloatField(IntegerField)    ...DecimalField(IntegerField)    max_value=None,              最大值    min_value=None,              最小值    max_digits=None,             总长度    decimal_places=None,         小数位长度BaseTemporalField(Field)    input_formats=None时间格式化    DateField(BaseTemporalField)    格式:2015-09-01TimeField(BaseTemporalField)    格式:11:12DateTimeField(BaseTemporalField)格式:2015-09-0111:12DurationField(Field)            时间间隔:%d %H:%M:%S.%f    ...RegexField(CharField)    regex,                      自定制正则表达式    max_length=None,            最大长度    min_length=None,            最小长度    error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}EmailField(CharField)           ...FileField(Field)    allow_empty_file=False是否允许空文件ImageField(FileField)           ...    注:需要PIL模块,pip3 install Pillow    以上两个字典使用时,需要注意两点:        -form表单中 enctype="multipart/form-data"        -view函数中 obj =MyForm(request.POST, request.FILES)URLField(Field)    ...BooleanField(Field)       ...NullBooleanField(BooleanField)    ...ChoiceField(Field)    ...    choices=(),                选项,如:choices =((0,'上海'),(1,'北京'),)    required=True,             是否必填    widget=None,               插件,默认select插件    label=None,                Label内容    initial=None,              初始值    help_text='',              帮助提示ModelChoiceField(ChoiceField)    ...                        django.forms.models.ModelChoiceField    queryset,                  # 查询数据库中的数据    empty_label="---------",   # 默认空显示内容    to_field_name=None,        # HTML中value的值对应的字段    limit_choices_to=None# ModelForm中对queryset二次筛选    ModelMultipleChoiceField(ModelChoiceField)    ...                        django.forms.models.ModelMultipleChoiceField    TypedChoiceField(ChoiceField)    coerce=lambdaval: val   对选中的值进行一次转换    empty_value=''            空值的默认值MultipleChoiceField(ChoiceField)    ...TypedMultipleChoiceField(MultipleChoiceField)    coerce=lambdaval: val   对选中的每一个值进行一次转换    empty_value=''            空值的默认值ComboField(Field)    fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式                               fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])MultiValueField(Field)    PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用SplitDateTimeField(MultiValueField)     input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']    input_time_formats=None格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中    path,                      文件夹路径    match=None,                正则匹配    recursive=False,           递归下面的文件夹    allow_files=True,          允许文件    allow_folders=False,       允许文件夹    required=True,     widget=None,     label=None,    initial=None,     help_text=''GenericIPAddressField    protocol='both',           both,ipv4,ipv6支持的IP格式    unpack_ipv4=False解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用SlugField(CharField)           数字,字母,下划线,减号(连字符)    ...UUIDField(CharField)           uuid类型    ... | 
注:UUID是根据MAC以及当前时间等创建的不重复的随机字符串
   >>> import uuid
    # make a UUID based on the host ID and current time
    >>> uuid.uuid1()    # doctest: +SKIP
    UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
    # make a UUID using an MD5 hash of a namespace UUID and a name
    >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
    UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')
    # make a random UUID
    >>> uuid.uuid4()    # doctest: +SKIP
    UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
    # make a UUID using a SHA-1 hash of a namespace UUID and a name
    >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
    UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
    # make a UUID from a string of hex digits (braces and hyphens ignored)
    >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')
    # convert a UUID to a string of hex digits in standard form
    >>> str(x)
    '00010203-0405-0607-0809-0a0b0c0d0e0f'
    # get the raw 16 bytes of the UUID
    >>> x.bytes
    b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
    # make a UUID from a 16-byte string
    >>> uuid.UUID(bytes=x.bytes)
    UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
2、Django内置插件:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | TextInput(Input)NumberInput(TextInput)EmailInput(TextInput)URLInput(TextInput)PasswordInput(TextInput)HiddenInput(TextInput)Textarea(Widget)DateInput(DateTimeBaseInput)DateTimeInput(DateTimeBaseInput)TimeInput(DateTimeBaseInput)CheckboxInputSelectNullBooleanSelectSelectMultipleRadioSelectCheckboxSelectMultipleFileInputClearableFileInputMultipleHiddenInputSplitDateTimeWidgetSplitHiddenDateTimeWidgetSelectDateWidget | 
常用选择插件
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | # 单radio,值为字符串# user = fields.CharField(#     initial=2,#     widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))# )# 单radio,值为字符串# user = fields.ChoiceField(#     choices=((1, '上海'), (2, '北京'),),#     initial=2,#     widget=widgets.RadioSelect# )# 单select,值为字符串# user = fields.CharField(#     initial=2,#     widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))# )# 单select,值为字符串# user = fields.ChoiceField(#     choices=((1, '上海'), (2, '北京'),),#     initial=2,#     widget=widgets.Select# )# 多选select,值为列表# user = fields.MultipleChoiceField(#     choices=((1,'上海'),(2,'北京'),),#     initial=[1,],#     widget=widgets.SelectMultiple# )# 单checkbox# user = fields.CharField(#     widget=widgets.CheckboxInput()# )# 多选checkbox,值为列表# user = fields.MultipleChoiceField(#     initial=[2, ],#     choices=((1, '上海'), (2, '北京'),),#     widget=widgets.CheckboxSelectMultiple# ) | 
在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。
方式一:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | fromdjango.forms importFormfromdjango.forms importwidgetsfromdjango.forms importfieldsfromdjango.core.validators importRegexValidatorclassMyForm(Form):    user =fields.ChoiceField(        # choices=((1, '上海'), (2, '北京'),),        initial=2,        widget=widgets.Select    )    def__init__(self, *args, **kwargs):        super(MyForm,self).__init__(*args, **kwargs)        # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)        # 或        self.fields['user'].widget.choices =models.Classes.objects.all().value_list('id','caption') | 
方式二:
使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现
| 1 2 3 4 5 6 7 8 9 10 | fromdjango importformsfromdjango.forms importfieldsfromdjango.forms importwidgetsfromdjango.forms importmodels as form_modelfromdjango.core.exceptions importValidationErrorfromdjango.core.validators importRegexValidatorclassFInfo(forms.Form):    authors =form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all()) | 
自定义验证规则
方式一:
| 1 2 3 4 5 6 7 8 9 | fromdjango.forms importFormfromdjango.forms importwidgetsfromdjango.forms importfieldsfromdjango.core.validators importRegexValidatorclassMyForm(Form):    user =fields.CharField(        validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],    ) | 
方式二:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | importrefromdjango.forms importFormfromdjango.forms importwidgetsfromdjango.forms importfieldsfromdjango.core.exceptions importValidationError# 自定义验证规则defmobile_validate(value):    mobile_re =re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')    ifnotmobile_re.match(value):        raiseValidationError('手机号码格式错误')classPublishForm(Form):    title =fields.CharField(max_length=20,                            min_length=5,                            error_messages={'required': '标题不能为空',                                            'min_length': '标题最少为5个字符',                                            'max_length': '标题最多为20个字符'},                            widget=widgets.TextInput(attrs={'class': "form-control",                                                          'placeholder': '标题5-20个字符'}))    # 使用自定义验证规则    phone =fields.CharField(validators=[mobile_validate, ],                            error_messages={'required': '手机不能为空'},                            widget=widgets.TextInput(attrs={'class': "form-control",                                                          'placeholder': u'手机号码'}))    email =fields.EmailField(required=False,                            error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},                            widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'})) | 
方法三:自定义方法
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | fromdjango importforms    fromdjango.forms importfields    fromdjango.forms importwidgets    fromdjango.core.exceptions importValidationError    fromdjango.core.validators importRegexValidator    classFInfo(forms.Form):        username =fields.CharField(max_length=5,                                    validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )        email =fields.EmailField()        defclean_username(self):            """            Form中字段中定义的格式匹配完之后,执行此方法进行验证            :return:            """            value =self.cleaned_data['username']            if"666"invalue:                raiseValidationError('666已经被玩烂了...', 'invalid')            returnvalue | 
方式四:同时生成多个标签进行验证
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | fromdjango.forms importFormfromdjango.forms importwidgetsfromdjango.forms importfieldsfromdjango.core.validators importRegexValidator############## 自定义字段 ##############classPhoneField(fields.MultiValueField):    def__init__(self, *args, **kwargs):        # Define one message for all fields.        error_messages ={            'incomplete': 'Enter a country calling code and a phone number.',        }        # Or define a different message for each field.        f =(            fields.CharField(                error_messages={'incomplete': 'Enter a country calling code.'},                validators=[                    RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),                ],            ),            fields.CharField(                error_messages={'incomplete': 'Enter a phone number.'},                validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],            ),            fields.CharField(                validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],                required=False,            ),        )        super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,                                         **kwargs)    defcompress(self, data_list):        """        当用户验证都通过后,该值返回给用户        :param data_list:        :return:        """        returndata_list############## 自定义插件 ##############classSplitPhoneWidget(widgets.MultiWidget):    def__init__(self):        ws =(            widgets.TextInput(),            widgets.TextInput(),            widgets.TextInput(),        )        super(SplitPhoneWidget, self).__init__(ws)    defdecompress(self, value):        """        处理初始值,当初始值initial不是列表时,调用该方法        :param value:        :return:        """        ifvalue:            returnvalue.split(',')        return[None, None, None] | 
初始化数据
在Web应用程序中开发编写功能时,时常用到获取数据库中的数据并将值初始化在HTML中的标签上。
1、Form
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | fromdjango.forms importFormfromdjango.forms importwidgetsfromdjango.forms importfieldsfromdjango.core.validators importRegexValidatorclassMyForm(Form):    user =fields.CharField()    city =fields.ChoiceField(        choices=((1, '上海'), (2, '北京'),),        widget=widgets.Select    ) | 
2、Views
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | fromdjango.shortcuts importrender, redirectfrom.forms importMyFormdefindex(request):    ifrequest.method =="GET":        values ={'user': 'root', 'city': 2}        obj =MyForm(values)        returnrender(request, 'index.html', {'form': obj})    elifrequest.method =="POST":        returnredirect('http://www.google.com')    else:        returnredirect('http://www.google.com') | 
3、HTML
原文链接:Django之Form组件
转载:Django之Form组件的更多相关文章
- Django之Form组件
		Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ... 
- Python之路【第二十一篇】:Django之Form组件
		Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ... 
- 第十一篇:web之Django之Form组件
		Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ... 
- python Django之Form组件
		python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ... 
- Django之Form组件(一)
		Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ... 
- python框架之Django(10)-Form组件
		介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ... 
- 〖Python〗-- Django的Form组件
		[Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ... 
- Django之Form组件验证
		今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类) ·前端把数据提交过来 ·匹配规则 · ... 
- django 使用form组件提交数据之form表单提交
		django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ... 
随机推荐
- JQuery-Validate明明配置好了但是不生效?卡了2个小时的bug解决了,原因很简单。
			JQuery Validate是表单验证的js工具,一般用于前台页面的校验,例如登陆和注册. 照着教程写了起来,使用Hbulider编辑器,本来写的时候可以用的,但是后来不知道怎么操作的,页面上的校验 ... 
- python 关闭redis的连接
			在python语言中使用redis时,没有找到对应的关闭的方法 try: self.redisconn = StrictRedisCluster(startup_nodes=self.redisNod ... 
- Linux下UDP简介及程序设计
			一.UDP简介 UDP(User Datagram Protocol),用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.UDP提供了无连接通信,且不对传 ... 
- _bzoj1087 [SCOI2005]互不侵犯King【dp】
			传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1087 令f(i, j, k)表示前i列,二进制状态为j,已经用了k个国王的方案数,则 f(i ... 
- Windows软件推荐
			本篇博文主要记录一些实用性的windows软件或者插件,重在积累! 工具类 1.截图软件 https://zh.snipaste.com/ Snipaste 是一个简单但强大的截图工具,也可以让你将截 ... 
- Oracle查询使用空间比较大的前15个表
			-- 查询使用空间比较大的前15个表 select a.* from( ,2) all_size from dba_segments where SEGMENT_TYPE='TABLE' order ... 
- Quartz~关于cron表达式要说的
			每20秒执行一次 
- Spring框架学习-搭建第一个Spring项目
			步骤一:下载Spring开发包. 官网:https://spring.io/ 下载地址:https://repo.spring.io/libs-release-local/org/ ... 
- bootstrap不同屏幕区分数值
			@media (min-width:1200px){ } @media (min-width:992px) and (max-width:1199px){ } @media (min-width:76 ... 
- CF915C Permute Digits
			思路: 从左到右贪心放置数字,要注意判断这个数字能否放置在当前位. 实现: #include <bits/stdc++.h> using namespace std; typedef lo ... 
