Python django之form
html,models,form内使用的字段名要相同
定义:
from django import forms
class FM(forms.Form):
name = forms.CharField() # 也可from django.forms import fields后name = fields.CharField() # 效果相同
pwd = forms.CharField()
email = forms.EmailField()
自定义提示信息:error_messages={***}
from django import forms
class FM(forms.Form):
name = forms.CharField(error_messages={'required':'用户名不能为空!', 'invalid':'用户名不合法!'},
widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'用户名'}))
pwd = forms.CharField(max_length=18,
min_length=6,
error_messages={'required':'密码不能为空!',
'max_length':'密码长度不得大于18!',
'min_length':'密码长度不得小于6'},
widget=forms.PasswordInput(attrs={'class': "form-control", 'placeholder': u'密码'}) # 支持密文显示
)
email = forms.EmailField(*支持上面自定义内容*)
user_type_choice = ((0, u'普通用户'),(1, u'高级用户'))
user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,
attrs={'class':"form-control"}))
自定义样式:
from django.forms import widgets # 使用widgets内的插件样式,样式内还可使用attrs={}设置样式属性
from django.forms import fields
name = fields.CharField(error_messages={'required':'用户名不能为空!', 'invalid':'用户名不合法!'},
widget = widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'用户名'})
)
注意: widget=forms.xxoo(attrs={***})与widget=widgets.xxoo(attrs={***}) 设置相同,效果相同
自定义验证:
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 FM(forms.Form):内
phone = fields.CharField(validators=[mobile_validate, ], # validators自定义验证规则,将前端获取的是传到mobile_validate处理
# validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
error_messages={'required': u'手机不能为空'},
widget=widgets.TextInput(attrs={'class': "form-control",
'placeholder': u'手机号码'}))
内置字段及参数:
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, 是否可以编辑
CharField(Field)
max_length=None, 最大长度
min_length=None, 最小长度
strip=True 是否移除用户输入空白
IntegerField(Field)
max_value=None, 最大值
min_value=None, 最小值
FloatField(IntegerField)
DateField(BaseTemporalField) 格式:2015-09-01
TimeField(BaseTemporalField) 格式:11:12
DurationField(Field) 时间间隔:%d %H:%M:%S.%f
RegexField(CharField)
regex, 自定制正则表达式
max_length=None, 最大长度
min_length=None, 最小长度
error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'}
EmailField(CharField)
ImageField(FileField)
...
注:需要PIL模块,pip3 install Pillow
以上两个字典使用时,需要注意两点:
- form表单中 enctype="multipart/form-data"
- view函数中 obj = MyForm(request.POST, request.FILES)
URLField(Field)
FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹
使用:
obj = FM(request.POST)
status = obj.is_valid() # 验证后状态,False/True
data = obj.cleaned_data # 验证后返回的数据
err = obj.errors # 验证后错误信息
ret = obj.errors.as_json() # 转为json格式
html:
例1
<p><input type="text" name="name" placeholder="用户名" value="{{ data.name }}"/>{{ err.name.0 }}</p>
<p><input type="password" name="pwd" placeholder="密码" />{{ err.pwd.0 }}</p>
<p><input type="text" name="email" placeholder="邮箱" value="{{ data.email }}" />{{ err.email.0 }}</p>
例2:{{ obj.xxoo }}自动生成html的xxoo模板,{{ obj.errors.name.0 }}返回结果如有错误信息则显示
<p>{{ obj.name }}{{ obj.errors.name.0 }}</p>
<p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p>
<p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
例3: 可定制性差
{{ obj.as_p }} # 根据obj对象内元素自动生成P标签
{{ obj.as_ul }} # 根据obj对象内元素自动生成ul标签
<table> # 注意使用下面方法,需手动写table标签,才可自动生成
{{ obj.as_table }}# 根据obj对象内元素自动生成table标签
</table>
注意:使用例2,3等方法需在GET方法内设置如下:
obj = FM() # 支撑{{ obj.as_p }}生成html模板等方法
return render(request, ‘fm.html’,{‘obj’:obj}) # 为自动生成html模版提供数据.
github