建设网站中期要做什么,wordpress可爱主题下载,如何把网站做的和别人一样,网站主体负责人一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 !DOCTYPE html
html langen
headmeta charsetUTF-8!DOCTYPE html
html langen
headmeta charsetUTF-8title注册页面/title
/head
body
form action/reg/ methodpost{% csrf_token %}p用户名:input typetext namename/pp密码input typepassword namepwd/ppinput typesubmit value注册p stylecolor: red{{ error_msg }}/p/p
/form
/body
/html login.html # 注册
def register(request):error_msg if request.method POST:username request.POST.get(name)pwd request.POST.get(pwd)# 对注册信息做校验if len(username) 6:# 用户长度小于6位error_msg 用户名长度不能小于6位else:# 将用户名和密码存到数据库return HttpResponse(注册成功)return render(request, register.html, {error_msg: error_msg}) Views.py 三. 使用form组件实现注册功能,自动创建表单 !DOCTYPE html
html langen
headmeta charsetUTF-8title注册2/title
/head
bodyform action/reg2/ methodpost novalidate autocompleteoff{% csrf_token %}divlabel for{{ form_obj.name.id_for_label }}{{ form_obj.name.label }}/label{{ form_obj.name }} {{ form_obj.name.errors.0 }}/divdivlabel for{{ form_obj.pwd.id_for_label }}{{ form_obj.pwd.label }}/label{{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}/divdivinput typesubmit classbtn btn-success value注册/div/form
/body
/html login2.html 先定义好一个RegForm类
from django import forms
# 按照Django form组件的要求自己写一个类
class RegForm(forms.Form):name forms.CharField(label用户名)pwd forms.CharField(label密码)再写一个视图函数:
# 使用form组件实现注册方式
def register2(request):form_obj RegForm()if request.method POST:# 实例化form对象的时候把post提交过来的数据直接传进去form_obj RegForm(request.POST)# 调用form_obj校验数据的方法if form_obj.is_valid():return HttpResponse(注册成功)return render(request, register2.html, {form_obj: form_obj}) Views.py 四. form常用的字段和与插件 创建Form类时主要涉及到 【字段】 和 【插件】字段用于对用户请求数据的验证插件用于自动生成HTML; 1. 组件 视图中: form_obj RegForm() # 实例化form对象
return render(request, reg2.html, {form_obj: form_obj}) 模板中: form标签加上novalidate 前段不进行校验 {{ form_obj.as_p }} ——》 生成所有的p标签 label input
{{ form_obj.errors }} ——》所有字段的错误
{{ form_obj.user }} ——》 该字段的input框
{{ form_obj.user.label }} ——》 该字段的label 中文提示
{{ form_obj.user.id_for_label }} ——》 该字段的id
{{ form_obj.user.errors }} ——》 该字段的所有的错误信息
{{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息 2. 字段 initial: 初始值, input框里面的初始值,默认值 class LoginForm(forms.Form):username forms.CharField(min_length8,label用户名,initial张三 # 设置默认值)pwd forms.CharField(min_length6, label密码) View Code error_messages: 重写错误信息 class LoginForm(forms.Form):username forms.CharField(min_length8,label用户名,initial张三,error_messages{required: 不能为空,invalid: 格式错误,min_length: 用户名最短8位})pwd forms.CharField(min_length6, label密码) View Code passwod: 密码 class LoginForm(forms.Form):...pwd forms.CharField(min_length6,label密码,widgetforms.widgets.PasswordInput(attrs{class: c1}, render_valueTrue)) View Code radioSelect: 单radio值为字符串 class LoginForm(forms.Form):username forms.CharField(min_length8,label用户名,initial张三,error_messages{required: 不能为空,invalid: 格式错误,min_length: 用户名最短8位})pwd forms.CharField(min_length6, label密码)gender forms.fields.ChoiceField(choices((1, 男), (2, 女), (3, 保密)),label性别,initial3,widgetforms.widgets.RadioSelect()) View Code select 单选select class LoginForm(forms.Form):...hobby forms.fields.MultipleChoiceField(choices((1, 篮球), (2, 足球), (3, 双色球), ),label爱好,initial[1, 3],widgetforms.widgets.SelectMultiple()) 多选select checkbox class LoginForm(forms.Form):...keep forms.fields.ChoiceField(label是否记住密码,initialchecked,widgetforms.widgets.CheckboxInput()) 单选checkbox class LoginForm(forms.Form):...hobby forms.fields.MultipleChoiceField(choices((1, 篮球), (2, 足球), (3, 双色球),),label爱好,initial[1, 3],widgetforms.widgets.CheckboxSelectMultiple()) 多选checkbox 关于choise的注意事项: 在使用选择标签时需要注意choices的选项可以从数据库中获取但是由于是静态字段 ***获取的值无法实时更新***那么需要自定义构造方法从而达到此目的。 from django.forms import Form
from django.forms import widgets
from django.forms import fieldsclass MyForm(Form):user fields.ChoiceField(# choices((1, 上海), (2, 北京),),initial2,widgetwidgets.Select)def __init__(self, *args, **kwargs):super(MyForm,self).__init__(*args, **kwargs)# self.fields[user].choices ((1, 上海), (2, 北京),)# 或self.fields[user].choices models.Classes.objects.all().values_list(id,caption) 方式一 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()) # 单选 方式二 3. Django Form所有内置字段 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类型 View Code 五. 校验 1. 内置校验 requiredTrue,min_length8,max_length12, 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开头)],) View Code 2. 自定义校验器 定义函数 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邮箱})) View Code from django.core.exceptions import ValidationError
def check(value):if alex in value:raise ValidationError(敏感词汇不符合社会职业核心价值观)
validators[check] 3. 局部钩子 定义一个放法 clean_字段名self,的方法如果不通过校验规则要抛出异常ValidationError如果通过校验规则返回通过校验的值 def clean_user(self):value self.cleaned_data.get(user)if alex in value:raise ValidationError(敏感词汇不符合社会职业核心价值观)return value 4. 全局钩子 定义一个放法 cleanself的方法如果不通过校验规则要抛出异常ValidationError还可以自己使用self.add_error(re_pwd, 两次密码不一致!!!)添加错误信息。如果通过校验规则返回所有通过校验的值 ef clean(self):pwd self.cleaned_data.get(pwd)re_pwd self.cleaned_data.get(re_pwd)if pwd ! re_pwd:self.add_error(re_pwd, 两次密码不一致!!!)raise ValidationError(两次密码不一致)return self.cleaned_data ModeForm 通常在Django项目中我们编写的大部分都是与Django 的模型紧密映射的表单。 举个例子你也许会有个Book 模型并且你还想创建一个form表单用来添加和编辑书籍信息到这个模型中。 在这种情况下在form表单中定义字段将是冗余的因为我们已经在模型中定义了那些字段。 基于这个原因Django 提供一个辅助类来让我们可以从Django 的模型创建Form这就是ModelForm。 modelForm定义 form与model的终极结合。 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.Book # 对应的Model中的类
fields __all__ # 字段如果是__all__,就是表示列出所有的字段
exclude None # 排除的字段
labels None # 提示信息
help_texts None # 帮助提示信息
widgets None # 自定义插件
error_messages None # 自定义错误信息 ModelForm的验证 与普通的Form表单验证类型类似ModelForm表单的验证在调用is_valid() 或访问errors 属性时隐式调用。 我们可以像使用Form类一样自定义局部钩子方法和全局钩子方法来实现自定义的校验规则。 如果我们不重写具体字段并设置validators属性的化ModelForm是按照模型中字段的validators来校验的。 save()方法 每个ModelForm还具有一个save()方法。 这个方法根据表单绑定的数据创建并保存数据库对象。 ModelForm的子类可以接受现有的模型实例作为关键字参数instance如果提供此功能则save()将更新该实例。 如果没有提供save() 将创建模型的一个新实例 from myapp.models import Bookfrom myapp.forms import BookForm# 根据POST数据创建一个新的form对象form_obj BookForm(request.POST)# 创建书籍对象new_ book form_obj.save()# 基于一个书籍对象创建form对象edit_obj Book.objects.get(id1)
# 使用POST提交的数据更新书籍对象form_obj BookForm(request.POST, instanceedit_obj)form_obj.save() 转载于:https://www.cnblogs.com/Ryan-Yuan/p/11582082.html