用狐狸做logo的网站,现在网站开发技术有哪些,wordpress集成环境搭建,代写平台在哪找一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验#xff0c;比如验证用户是否输入#xff0c;输入的长度和格式等是否正…一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验比如验证用户是否输入输入的长度和格式等是否正确如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息。 Django Form组件就实现了上面所述的功能。 1、生成页面可用的html标签生成input框 2、对用户提交的数据进行校验 3、错误信息的展示 4、保留上次的输入 缺点只能生成form表单里面的内容form标签需要自己建立提交的按钮需要自己写csrf_token也需要自己添加 二、form组件的字段和插件 创建form类时主要涉及到【字段】和【插件】字段用于对用户请求数据的验证插件用于自动生成html 字段创建默认为input框中的类型为text可以通过插件来修改成按钮多选框等等。 想通过插件修改需要导入插件模块from django.forms import widgets 1、字段 CharField(参数) 所有的字段都继承Field类初始化都是TextFied改变type都可以通过widgets改变 注所有的字段类型都可以用CharField然后通过widgets来修改 ChoiceField() 选择类的字段 通过widgets可改变为widget forms.widgets.radioSelect() radioSelect(单选按钮) Select单选下拉 SelectMultiple多选下拉 checkbox单选方形按钮 checkboxSelectMultiple(多选方形按钮) 示例如何使用choiseField字段及使用数据库中的数据class LoginForm(forms.Form):...hobby forms.fields.ChoiceField(# choices((1, 篮球), (2, 足球), (3, 双色球),),choices models.Hobby.object.all().values_list(id, name)label爱好,initial[1, 3],widgetforms.widgets.CheckboxSelectMultiple()) # 上面choices就用到了从数据库中获取数据但这种方式每次更改数据库都需要重启项目前端才能更新信息 关于choice的注意事项 在使用选择标签字段时需要注意choices的选项可以从数据库中获取但时由于时静态字段获取的值无法实时更新即 中途向数据库中添加数据前端不会实时更新需要重启项目的问题但重启项目明显不好故可通过构造函数每次查询时都先去数据库中查一下使用的数据库中的字段。将如下的方法也放到类中即可。 方案一 def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.fields[hobby3].choices models.Hobby.objects.all().values_list(id, name)注其中fields代表的是自定义form类中所有的字段注当定义了__init__方法那么类中对应字段的choices就可以删掉了 方案二 from django import forms
from django.forms import fields
from django.forms import models as form_modelclass FInfo(forms.Form):authors form_model.ModelMultipleChoiceField(querysetmodels.NNewType.objects.all()) # 多选# authors form_model.ModelChoiceField(querysetmodels.NNewType.objects.all()) # 单选 DjangoForm所有的内置字段 FieldrequiredTrue, 是否允许为空widgetNone, HTML插件labelNone, 用于生成Label标签或显示内容initialNone, 初始值help_text, 帮助信息(在标签旁边显示)error_messagesNone, 错误信息 {required: 不能为空, invalid: 格式错误}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类型 Django Form内置字段 2、参数 label 显示的文本如input框前的“用户名” initail 初始化的值即默认值 required 是否必填requiredTrue help_text 在input框后的提示信息 error_messages {min_length: 太短了required 此数字必须填写} 定义字段验证不通过时提示的错误信息格式为字典 widget forms.widgets.PasswrodInput(attrs{class: form_contronl}) 加插件可以改变input框的类型也可以为input标签加各种属性如classstyle等等。 validators [验证器1] 里面可以时django默认的验证器也可以自己定义验证方法然后放入其中 3、验证 1、djangoForm组件字段验证顺序 form_obj.is_vaild() 通过则将字段加入clean_data字典集合中如果不通过则报错不会将对应字段名加入到字典中故后面自定义的方法是拿不到字段的 | django自己的clean(self) 方法 | 自定义的clean_字段名 的方法 系统会通过反射检索是否自定义以clean_开头的方法如果有就执行 | 自定义的clean(self) 方法 这个方法是全局的对所有的字段校验本质是复写django的clean方法 2、form校验的几种方式 validators [验证器1] 2.1、内置的验证 max_length/min_length required 2.2、自定义验证器 方式一、 from django.core.Validators import RegexCalidator 有很多这样的类这个是正则验证的模块validators[RegexValidator(r^[a-zA-Z][a-zA-Z0-9_]{4,18}, 4~18个字符首字符为字母)]格式为前部分为正则后半部分为提示信息 方式二、 # 定义函数from django.core.exceptions import ValidationErrordef validator_check(value):# 定义方法设计规则用于验证if sex in value:raise ValidationError(含有非法字符)然后在类中的字段 validators中调用方法即可validators [validator_check] # 不用加括号 2.3、利用钩子函数自定义验证 钩子框架级别的东西流程过程中预留一些空白有就进行验证没有就过 钩子函数利用反射hasattr拿到方法的字符串有就执行没有就过 局部单独为某个字段设置 clean_字段名self:通过校验返回当前校验的值 【for循环校验】不通过:raise ValidationError(不通过) 报错为什么报错 因为源码中通过try捕获到错误放入到err_diact中继续执行其它的程序 全局所有的字段都校验完了才回执行里面只有通过的字段 clean(self)通过校验返回 self.cleaned_data不通过self.add_error(re_wd, 两次密码不一致)raise ValidationError(不通过) 报错 PSform表单中如果在form标签中加入属性novalidate ,则前端不会做校验。 三、定义一个form组件 1、创建 可在视图中创建但最好在app下单独建立一个py文件如myform.py 1.1、导入模块 from django import forms 1.2、定义form类继承forms.Form(只能定义若干个数据库表中的字段) 或 forms.Models可批量定义 1.3、定义字段可以是数据库中的那么值就需要通过orm操作获取数据库中的值 示例 from django import forms
from django.forms import widgets # 插件的意思就是改变【字段】input的类型如checkbox等等
from django.core.validators import RegexValidator # 用于校验正则class MyForms(forms.Form):username forms.CharField(label用户名,help_text人生库端4444, # input框右边的提示语min_length4,initial不能小于5个字符,error_messages{min_length: 长度不符合规则},widgetwidgets.TextInput(attrs{class: form-control}),validators[RegexValidator(r^[a-zA-Z][a-zA-Z0-9_]{4,18}, 4~18个字符首字符为字母)])password forms.CharField(label密码,# 密码默认明文显示可通过插件修改widgetwidgets.PasswordInput(attrs{class: form-control}),hobby2 forms.ChoiceField(labellove下拉多选, initial3, choices((1, lan), (2, qiu), (3, dd)),widgetwidgets.SelectMultiple(attrs{class: form-control}) # 下拉多选)
) 2、使用 2.1、后端使用views.py from app_name.myform import MyFormdef view_func(request):form_obj MyForm() 实例化if request.method POSt:form_obj MyForm(request.POST) 将接收到的数据传进去form_obj.is_vaild() 做校验后台自动完成form_obj.cleaned_data 字典已经通过校验的所有字段没有通过不会放入到里面return render(request, index.html , {form_obj: form_obj})注两次实例化变量名都为form_obj这样优化代码不然post请求验证不过返回错误信息还要写一个return。 2.2、前端使用 {{form_obj}} 直接生成所有的字段,不过没有格式{{form_obj.name.lable_tag}} 直接生成一个lable的标签{{form_obj.as_p}} 所有的字段生成input框每个input外面时p标签生成的html代码如下以as_p为例Plable for{{form_obj.name.id_for_label}}{{form_obj.name.label}}/lableinput/p{{form_obj.as_table/as_ui}}{{form_obj.name}} name字段生成的input框框的类型type和定义时charField定义有关{{form_obj.name.label}} name的标签显示的文字如用户名{{form_obj.name.id_for_label}} input框的id用于与label标签的for关联{{form_obj.name.errors}} 该字段后台验证返回来的所有的错误{{form_obj.name.errors.0}} 该字段后台验证返回来的所有的错误的第一个错误所有的错误放在一个字典中{{form_obj.errors}} form表单的所有的错误 四、应用bootstrap样式如何使用form组件 方式一一个一个字段写 !DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivx-ua-compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1link relstylesheet href/static/bootstrap/css/bootstrap.min.csstitlelogin/title
/head
body
div classcontainerdiv classrowform action/login2/ methodpost novalidate classform-horizontal{% csrf_token %}div classform-grouplabel for{{ form_obj.username.id_for_label }}classcol-md-2 control-label{{ form_obj.username.label }}/labeldiv classcol-md-10{{ form_obj.username }}span classhelp-block{{ form_obj.username.errors.0 }}/span/div/divdiv classform-grouplabel for{{ form_obj.pwd.id_for_label }} classcol-md-2 control-label{{ form_obj.pwd.label }}/labeldiv classcol-md-10{{ form_obj.pwd }}span classhelp-block{{ form_obj.pwd.errors.0 }}/span/div/divdiv classform-grouplabel classcol-md-2 control-label{{ form_obj.gender.label }}/labeldiv classcol-md-10div classradio{% for radio in form_obj.gender %}label for{{ radio.id_for_label }}{{ radio.tag }}{{ radio.choice_label }}/label{% endfor %}/div/div/divdiv classform-groupdiv classcol-md-offset-2 col-md-10button typesubmit classbtn btn-default注册/button/div/div/form/div
/divscript src/static/jquery-3.2.1.min.js/script
script src/static/bootstrap/js/bootstrap.min.js/script
/body
/html 方式二通过for循环直接通过field即可 div classpanel panel-primarydiv classpanel-heading 编辑页面/divdiv classpanel-bodyform classform-horizontal methodpost{% csrf_token %}{% for field in customer_form_obj %}div classform-group label for{{ field.id_for_label }} classcol-sm-2 control-label{{ field.label }}/labeldiv classcol-sm-10 {{ field }}/divspan classhelp-block{{ field.errors.0 }}/span/div{% endfor %}button typesubmit classbtn btn-lg btn-success btn-block center-block提交/button/form/div
/div 五、form组件批量添加样式 可通过重写form类的init方法来实现。 class LoginForm(forms.Form):username forms.CharField(min_length8,label用户名,initial张三,error_messages{required: 不能为空,invalid: 格式错误,min_length: 用户名最短8位}...def __init__(self, *args, **kwargs):super(LoginForm, self).__init__(*args, **kwargs)for field in iter(self.fields):self.fields[field].widget.attrs.update({class: form-control}) 批量添加样式 如何限制Form中下来框中值的选取范围 1. 可以将model的实例以参数instanceobj传入在form组件中引用self.instance 来操作orm进行限制 2. 在post请求时data request.POST ,instanceobj - views.py
# 客户的增删改查
def customer_change(request, edit_idNone):要求添加完成后还回到之前的页面if re.match(^/del_customer/(\d)/$, request.path_info):check_obj models.Customer.objects.filter(idedit_id)if not check_obj:return HttpResponse(目标不存在非法操作)check_obj.delete()next_url request.GET.get(next_url, )return redirect(next_url)msg edit_obj models.Customer.objects.filter(idedit_id).first()customer_form_obj forms.CustomerForm(instanceedit_obj)if request.method POST:next_url request.GET.get(next_url, )customer_form_obj forms.CustomerForm(datarequest.POST, instanceedit_obj)if customer_form_obj.is_valid():customer_form_obj.save()return redirect(tonext_url)else:msg 请按要求填写信息- forms.py
class ConsultRecordForm(BaseStyle):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 限制添加客户跟进记录只能选择自己的客户self.fields[customer].widget.choices [(i.id, i) for i in self.instance.consultant.customers.all()]# 限制添加客户记录销售下拉只能是自己self.fields[consultant].widget.choices [(self.instance.consultant.id, self.instance.consultant), ]class Meta:model models.ConsultRecordfields __all__exclude [delete_status]widgets {consultant: forms.widgets.Select()} 六、ModelForm form与model的终极结合可直接使用models中的所有字段 class BookForm(forms.ModelForm):class Meta:model models.Bookfields __all__labels {title: 书名,price: 价格}widgets {password: forms.widgets.PasswordInput(attrs{class: c1}),} class Meta:下常用参数 model models.Student # 对应的Model中的类
fields __all__ # 字段如果是__all__,就是表示列出所有的字段
exclude None # 排除的字段
labels None # 提示信息
help_texts None # 帮助提示信息
widgets None # 自定义插件
error_messages None # 自定义错误信息 转载于:https://www.cnblogs.com/sunxiuwen/p/9741998.html