上海昆山网站公司哪家好,莱州教体局网站,平面广告设计培训招生,专业做电商培训的平台django Form组件 Django的Form主要具有一下几大功能#xff1a; 生成HTML标签验证用户数据#xff08;显示错误信息#xff09;HTML Form提交保留上次提交数据初始化页面显示内容小试牛刀 1、创建Form类 from django.forms import Form
from django.forms import widgets #…django Form组件 Django的Form主要具有一下几大功能 生成HTML标签验证用户数据显示错误信息HTML Form提交保留上次提交数据初始化页面显示内容小试牛刀 1、创建Form类 from django.forms import Form
from django.forms import widgets #插件
from django.forms import fieldsclass MyForm(Form):user fields.CharField(widgetwidgets.TextInput(attrs{id: i1, class: c1}))gender fields.ChoiceField( #单选choices((1, 男), (2, 女),),initial2,widgetwidgets.RadioSelect)city fields.CharField(initial2,widgetwidgets.Select(choices((1,上海),(2,北京),)))pwd fields.CharField(widgetwidgets.PasswordInput(attrs{class: c1}, render_valueTrue))2、views函数处理 from django.shortcuts import render, redirect
from .forms import MyFormdef index(request):if request.method GET:obj MyForm()return render(request, index.html, {form: obj})elif request.method POST:obj MyForm(request.POST, request.FILES)if obj.is_valid():values obj.clean()print(values)else:errors obj.errorsprint(errors)return render(request, index.html, {form: obj})else:return redirect(http://www.google.com)3、生成HTML form action/ methodPOST enctypemultipart/form-data #上传文件特殊的方法p{{ form.user }} {{ form.user.errors }}/pp{{ form.gender }} {{ form.gender.errors }}/pp{{ form.city }} {{ form.city.errors }}/pp{{ form.pwd }} {{ form.pwd.errors }}/pinput typesubmit/
/form form methodPOST enctypemultipart/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 }}/pinput typesubmit //form From类 创建Form类时主要涉及到 【字段】 和 【插件】字段用于对用户请求数据的验证插件用于自动生成HTML; 1、Django内置字段如下 FieldrequiredTrue, 是否允许为空widgetNone, HTML插件labelNone, 用于生成Label标签或显示内容initialNone, 初始值help_text, 帮助信息(在标签旁边显示)error_messagesNone, 错误信息 {required: 不能为空, invalid: 格式错误}show_hidden_initialFalse, 是否在当前插件后面再加一个隐藏的且具有默认值的插件可用于检验两次输入是否一直validators[], 自定义验证规则localizeFalse, 是否支持本地化disabledFalse, 是否可以编辑label_suffixNone Label内容后缀CharField(Field)max_lengthNone, 最大长度min_lengthNone, 最小长度stripTrue 是否移除用户输入空白IntegerField(Field)max_valueNone, 最大值min_valueNone, 最小值FloatField(IntegerField)...DecimalField(IntegerField)max_valueNone, 最大值min_valueNone, 最小值max_digitsNone, 总长度decimal_placesNone, 小数位长度BaseTemporalField(Field)input_formatsNone 时间格式化 DateField(BaseTemporalField) 格式2015-09-01
TimeField(BaseTemporalField) 格式11:12
DateTimeField(BaseTemporalField)格式2015-09-01 11:12DurationField(Field) 时间间隔%d %H:%M:%S.%f...RegexField(CharField)regex, 自定制正则表达式max_lengthNone, 最大长度min_lengthNone, 最小长度error_messageNone, 忽略错误信息使用 error_messages{invalid: ...}EmailField(CharField) ...FileField(Field)allow_empty_fileFalse 是否允许空文件ImageField(FileField) ...注需要PIL模块pip3 install Pillow以上两个字典使用时需要注意两点- form表单中 enctypemultipart/form-data- view函数中 obj MyForm(request.POST, request.FILES)URLField(Field)...BooleanField(Field) ...NullBooleanField(BooleanField)...ChoiceField(Field)...choices(), 选项如choices ((0,上海),(1,北京),)requiredTrue, 是否必填widgetNone, 插件默认select插件labelNone, Label内容initialNone, 初始值help_text, 帮助提示ModelChoiceField(ChoiceField)... django.forms.models.ModelChoiceFieldqueryset, # 查询数据库中的数据empty_label---------, # 默认空显示内容to_field_nameNone, # HTML中value的值对应的字段limit_choices_toNone # ModelForm中对queryset二次筛选ModelMultipleChoiceField(ModelChoiceField)... django.forms.models.ModelMultipleChoiceFieldTypedChoiceField(ChoiceField)coerce lambda val: val 对选中的值进行一次转换empty_value 空值的默认值MultipleChoiceField(ChoiceField)...TypedMultipleChoiceField(MultipleChoiceField)coerce lambda val: val 对选中的每一个值进行一次转换empty_value 空值的默认值ComboField(Field)fields() 使用多个验证如下即验证最大长度20又验证邮箱格式fields.ComboField(fields[fields.CharField(max_length20), fields.EmailField(),])MultiValueField(Field)PS: 抽象类子类中可以实现聚合多个字典去匹配一个值要配合MultiWidget使用SplitDateTimeField(MultiValueField)input_date_formatsNone, 格式列表[%Y--%m--%d, %m%d/%Y, %m/%d/%y]input_time_formatsNone 格式列表[%H:%M:%S, %H:%M:%S.%f, %H:%M]FilePathField(ChoiceField) 文件选项目录下文件显示在页面中path, 文件夹路径matchNone, 正则匹配recursiveFalse, 递归下面的文件夹allow_filesTrue, 允许文件allow_foldersFalse, 允许文件夹requiredTrue,widgetNone,labelNone,initialNone,help_textGenericIPAddressFieldprotocolboth, both,ipv4,ipv6支持的IP格式unpack_ipv4False 解析ipv4地址如果是::ffff:192.0.2.1时候可解析为192.0.2.1 PSprotocol必须为both才能启用SlugField(CharField) 数字字母下划线减号连字符...UUIDField(CharField) uuid类型...注UUID是根据MAC以及当前时间等创建的不重复的随机字符串 import uuid# make a UUID based on the host ID and current time uuid.uuid1() # doctest: SKIPUUID(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: SKIPUUID(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.bytesb\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(bytesx.bytes)UUID(00010203-0405-0607-0809-0a0b0c0d0e0f) View Code 2、Django内置插件 TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget常用选择插件 # 单radio值为字符串
# user fields.CharField(
# initial2,
# widgetwidgets.RadioSelect(choices((1,上海),(2,北京),))
# )# 单radio值为字符串
# user fields.ChoiceField(
# choices((1, 上海), (2, 北京),),
# initial2,
# widgetwidgets.RadioSelect
# )# 单select值为字符串
# user fields.CharField(
# initial2,
# widgetwidgets.Select(choices((1,上海),(2,北京),))
# )# 单select值为字符串
# user fields.ChoiceField(
# choices((1, 上海), (2, 北京),),
# initial2,
# widgetwidgets.Select
# )# 多选select值为列表
# user fields.MultipleChoiceField(
# choices((1,上海),(2,北京),),
# initial[1,],
# widgetwidgets.SelectMultiple
# )# 单checkbox
# user fields.CharField(
# widgetwidgets.CheckboxInput()
# )# 多选checkbox,值为列表
# user fields.MultipleChoiceField(
# initial[2, ],
# choices((1, 上海), (2, 北京),),
# widgetwidgets.CheckboxSelectMultiple
# )在使用选择标签时需要注意choices的选项可以从数据库中获取但是由于是静态字段 ***获取的值无法实时更新***那么需要自定义构造方法从而达到此目的。 方式一 class TeacherFrom(Form):tnamefields.CharField(min_length2)xxfields.MultipleChoiceField( #多选框用MultipleChoiceField# choicesmodels.Classes.objects.values_list(id,title),widgetwidgets.SelectMultiple) #多选框def __init__(self,*args,**kwargs): #修复一个小bug定义一个init方法继承TeacherTrom的内容#构造自己都有的方法每次实例化出来的对象。super(TeacherFrom,self).__init__(*args,**kwargs)self.fields[xx].choicesmodels.Classes.objects.values_list(id,title)方式二 使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现 from django import forms
from django.forms import fields
from django.forms import widgets
from django.forms import models as form_model
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidatorclass FInfo(forms.Form):authors form_model.ModelMultipleChoiceField(querysetmodels.NNewType.objects.all())# authors form_model.ModelChoiceField(querysetmodels.NNewType.objects.all())自定义验证规则 方式一 from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidatorclass MyForm(Form):user fields.CharField(validators[RegexValidator(r^[0-9]$, 请输入数字), RegexValidator(r^159[0-9]$, 数字必须以159开头)],)方式二 import re
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.exceptions import ValidationError# 自定义验证规则
def mobile_validate(value):mobile_re re.compile(r^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$)if not mobile_re.match(value):raise ValidationError(手机号码格式错误)class PublishForm(Form):title fields.CharField(max_length20,min_length5,error_messages{required: 标题不能为空,min_length: 标题最少为5个字符,max_length: 标题最多为20个字符},widgetwidgets.TextInput(attrs{class: form-control,placeholder: 标题5-20个字符}))# 使用自定义验证规则phone fields.CharField(validators[mobile_validate, ],error_messages{required: 手机不能为空},widgetwidgets.TextInput(attrs{class: form-control,placeholder: u手机号码}))email fields.EmailField(requiredFalse,error_messages{required: u邮箱不能为空,invalid: u邮箱格式错误},widgetwidgets.TextInput(attrs{class: form-control, placeholder: u邮箱}))方法三自定义方法 from django import formsfrom django.forms import fieldsfrom django.forms import widgetsfrom django.core.exceptions import ValidationErrorfrom django.core.validators import RegexValidatorclass FInfo(forms.Form):username fields.CharField(max_length5,validators[RegexValidator(r^[0-9]$, Enter a valid extension., invalid)], )email fields.EmailField()def clean_username(self):Form中字段中定义的格式匹配完之后执行此方法进行验证:return:value self.cleaned_data[username]if 666 in value:raise ValidationError(666已经被玩烂了..., invalid)return value方式四同时生成多个标签进行验证 from django.forms import Form
from django.forms import widgets
from django.forms import fieldsfrom django.core.validators import RegexValidator############## 自定义字段 ##############
class PhoneField(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.)],requiredFalse,),)super(PhoneField, self).__init__(error_messageserror_messages, fieldsf, require_all_fieldsFalse, *args,**kwargs)def compress(self, data_list):当用户验证都通过后该值返回给用户:param data_list::return:return data_list############## 自定义插件 ##############
class SplitPhoneWidget(widgets.MultiWidget):def __init__(self):ws (widgets.TextInput(),widgets.TextInput(),widgets.TextInput(),)super(SplitPhoneWidget, self).__init__(ws)def decompress(self, value):处理初始值当初始值initial不是列表时调用该方法:param value::return:if value:return value.split(,)return [None, None, None]初始化数据 在Web应用程序中开发编写功能时时常用到获取数据库中的数据并将值初始化在HTML中的标签上。 1、Form from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidatorclass MyForm(Form):user fields.CharField()city fields.ChoiceField(choices((1, 上海), (2, 北京),),widgetwidgets.Select)2、Views from django.shortcuts import render, redirect
from .forms import MyFormdef index(request):if request.method GET:values {user: root, city: 2}obj MyForm(values)return render(request, index.html, {form: obj})elif request.method POST:return redirect(http://www.google.com)else:return redirect(http://www.google.com)3、HTML form methodPOST enctypemultipart/form-data{% csrf_token %}p{{ form.user }} {{ form.user.errors }}/pp{{ form.city }} {{ form.city.errors }}/pinput typesubmit/
/formis_valid 内部原理 #is_valid 内部原理1.LoginForm实例化时self.fields{ #self.fields是一个子典的格式 key是每个字段user:正则表达式pwd:正则表达式}2.循环self.fieldsflagTrueerrorscleaned_datafor k,v in self.fields.items():#1.user,正则表达式input_value request.POST.get(k)正则表达式和input_valueflag False:return flag #返回错误信息 class LoginForm(Form):userfields.CharField(max_length16,min_length6,requiredTrue,error_messages{request:用户名不能为空,max_length16:用户名不能过长,min_length6:用户名不能太短,})pwdfields.CharField(min_length8,requiredTrue)def login(request):if request.method GET:return render(request,login.html)else:objLoginForm(request.POST)#is_valid 内部原理1.LoginForm实例化时self.fields{ #self.fields是一个子典的格式 key是每个字段user:正则表达式pwd:正则表达式}2.循环self.fieldsflagTrueerrorscleaned_datafor k,v in self.fields.items():#1.user,正则表达式input_value request.POST.get(k)正则表达式和input_valueflag False:return flag #返回错误信息if obj.is_valid():print(obj.cleaned_data)return redirect(http://www.baidu.com)else:print(obj.errors)return render(request,login.html,{obj:obj}) View Code 转载于:https://www.cnblogs.com/niejinmei/p/7126704.html