本文共 5179 字,大约阅读时间需要 17 分钟。
django中的Form一般有两种功能:
输入html验证用户输入
#!/usr/bin/env python3# -*- coding:utf-8 -*-import refrom django import formsfrom django.core.exceptions import ValidationErrordef 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(forms.Form): user_type_choice = ( (0, u'普通用户'), (1, u'高级用户'), ) user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice, attrs={ 'class': "form-control"})) title = forms.CharField(max_length=20, min_length=5, error_messages={ 'required': u'标题不能为空', 'min_length': u'标题最少为5个字符', 'max_length': u'标题最多为20个字符'}, widget=forms.TextInput(attrs={ 'class': "form-control", 'placeholder': u'标题5-20个字符'})) memo = forms.CharField(required=False, max_length=256, widget=forms.widgets.Textarea(attrs={ 'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3})) phone = forms.CharField(validators=[mobile_validate, ], error_messages={ 'required': u'手机不能为空'}, widget=forms.TextInput(attrs={ 'class': "form-control", 'placeholder': u'手机号码'})) email = forms.EmailField(required=False, error_messages={ 'required': u'邮箱不能为空','invalid': u'邮箱格式错误'}, widget=forms.TextInput(attrs={ 'class': "form-control", 'placeholder': u'邮箱'}))
# 举个栗子
def publish(request): ret = { 'status': False, 'data': '', 'error': '', 'summary': ''} if request.method == 'POST': request_form = PublishForm(request.POST) if request_form.is_valid(): request_dict = request_form.clean() print request_dict ret['status'] = True else: error_msg = request_form.errors.as_json() ret['error'] = json.loads(error_msg) return HttpResponse(json.dumps(ret))
利用Form还可以自动生成前端的input标签:
from app01 import modelsfrom django import formsclass Form1(forms.Form): user = forms.CharField( widget=forms.TextInput(attrs={ 'class':'c1'}), # 给标签添加属性 error_messages={ 'required':'用户名不能为空'}, # 自定义错误输出 ) pwd = forms.CharField(max_length=4, min_length=2) email = forms.EmailField(error_messages={ 'required':'邮箱不能为空', 'invalid':'邮箱格式错误'}) memo = forms.CharField( widget=forms.Textarea() ) # user_type_choice = ( # (0, '普通用户'), # (1, '高级用户'), # ) user_type_choice = models.BookType.objects.values_list("id", "caption") # 这样并不能跟数据库实时同步,因为静态字段不更新 book_type = forms.CharField( widget=forms.widgets.Select(choices=user_type_choice) ) def __init__(self, *args, **kwargs): super(Form1, self).__init__(*args, **kwargs) # 让选项框跟数据库进行实时联动,解决上一行注释的问题 self.fields['book_type'] = forms.CharField( widget=forms.widgets.Select(choices=models.BookType.objects.values_list("id", "caption")) )
def form1(request): if request.method == "POST": # 获取请求做验证 f = Form1(request.POST) if f.is_valid(): print(f.cleaned_data) else: pass # print(f.errors['user'][0]) # print(f.errors['pwd'][0]) return render(request, "form1.html", { 'error': f.errors, 'form':f}) else: f = Form1() return render(request, 'form1.html',{ 'form':f})
Title
扩展:ModelForm
在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义
class AdminModelForm(forms.ModelForm): class Meta: model = models.Admin #fields = '__all__' fields = ('username', 'email') widgets = { 'email' : forms.PasswordInput(attrs={ 'class':"alex"}), }
转载地址:http://xbjji.baihongyu.com/