天天看点

Python django之form

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