一、Form的前端循环
class LoginForm(Form): name = ... pwd = ... def func(request): form = LoginForm() return ren.... //不循环 <div> {{ form.name }} {{for.errors.name.0}} {{ form.pwd }} {{for.errors.pwd.0}} </div> //循环 <div> {% for fd in form %} {{fd.label}} {{fd}} {{fd.errors.0}} {% endfor %} </div>
二、自定义Form验证规则
from正则校验的方法有三种
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
def func(val): if len(val) < 15: raise ValidationError('你太短了')#必须是ValidationError class LoginForm(Form): name1 = fields.CharField(label='xxx', widget=widgets.Textarea, validators=[RegexValidator(regex=""),])#第一种 导入 name2 = fields.RegexField(label='xxx', widget=widgets.Textarea, regex="xxx")#第二种 name3 = fields.CharField(label=que.caption, widget=widgets.Textarea, validators=[func, "错误信息"])#第三种 func为上面的func函数 #当然对于一些复杂的逻辑建议使用钩子函数 def clean_name1(self,val): return val
三 定义类的两种方法
第一种
class User(object): countury='china' def __init__(self,args): self.args=args def get(self): return self.args
第二种
#类名=type('类名',(继承的类,),dict) def ff(): return 123 Foo = type('Foo',(object,),{'x1':8,'func':lambda self,arg:arg,"ff":ff})
应用
问卷调查学生填写问卷的时候动态生成form
def fun(value): if len(value)<15: raise ValidationError("必须超过15字") dic = {} questions=models.Question.objects.filter(questionSuv__id=questionSuv_id).all() for question in questions: if question.type==1: dic['option_id_%s'%question.id]=fields.ChoiceField( label=question.title, widget=widgets.RadioSelect, choices=models.Option.objects.filter(question=question).values_list("id","title"), error_messages={"required": "必选"}, ) elif question.type ==2: dic['value_%s'%question.id]=fields.ChoiceField( label=question.title, widget=widgets.RadioSelect, choices=[(i,i) for i in range(1,11)], error_messages={"required":'必选'}, ) else: dic["content_%s"%question.id]=fields.CharField( label=question.title, widget=widgets.Textarea, error_messages={"required":'必填'}, validators=[fun,], ) #创建对象的另一种方法 这是动态生成form JoinQuestionSuvForm = type('JoinQuestionSuvForm', (Form,), dic)