发布网友 发布时间:2024-10-03 10:04
共1个回答
热心网友 时间:2024-12-05 03:38
本篇文章首席CTO笔记来给大家介绍有关django表单验证怎么用以及django图形验证码的相关内容,希望对大家有所帮助,一起来看看吧。
1.DjangoForms的强大之处
有些django项目并不直接呈现HTML,二是以API框架的形式存在,但你可能没有想到,在这些API形式的django项目中也用到了djangoforms.djangoforms不仅仅是用来呈现HTML的,他们最强的地方应该是他们的验证能力.下面我们就介绍几种和Djangoforms结合使用的模式:
2.模式一:ModelForm和默认验证
最简单的使用模式便是ModelForm和model中定义的默认验证方式的组合:
#myapp/views.py
fromdjango.views.genericimportCreateView,UpdateView
frombraces.viewsimportLoginRequiredMixin
from.modelsimportArticle
classArticleCreateView(LoginRequiredMixin,CreateView):
model=Article
fields=('title','slug','review_num')
classArticleUpdateView(LoginRequiredMixin,UpdateView):
model=Article
fields=('title','slug','review_num')
正如以上代码中看到的一样:
ArticleCreateView和ArticleUpdateView中设置model为Article
两个view都基于Articlemodel自动生成了ModelForm
这些ModelForm的验证,是基于Articlemodel中定义的field转换而来的
3.模式二,在ModelForm中修改验证
在上面的例子中,如果我们希望每篇articletitle的开头都是"new",那么应该怎么做呢?首先我们需要建立自定义的验证(validator):
#utils/validator.py
fromdjango.core.exceptionsimportValidationError
defvalidate_begins(value):
ifnotvalue.startswith(u'new'):
raiseValidationError(u'Muststartwithnew')
可见,在django中的验证程序就是不符合条件便抛出ValidationError的function,为了方便重复使用,我们将它们放在djangoapputils的validators.py中.
接下来,我们可以在model中加入这些validator,但为了今后的方便修改和维护,我们更倾向于加入到ModelForm中:
#myapp/forms.py
fromdjangoimportforms
fromutils.validatorsimportvalidate_begin
from.modelsimportArticle
classArticleForm(forms.ModelForm):
dev__init__(self,*args,**kwargs):
super(ArticleForm,self).__init__(8args,**kwargs)
self.fields["title"].validators.append(validate_begin)
classMeta:
model=Article
Django的editviews(UpdateView和CreateView等)的默认行为是根据view中model属性,自动创建ModelForm.因此,我们需要调用我们自己的Modelform来覆盖自动创建的:
#myapp/views.py
fromdjango.views.genericimportCreateView,UpdateView
frombraces.viewsimportLoginRequiredMixin
from.modelsimportArticle
from.formsimportArticleForm
classArticleCreateView(LoginRequiredMixin,CreateView):
model=Article
fields=('title','slug','review_num')
form_class=ArticleForm
classArticleUpdateView(LoginRequiredMixin,UpdateView):
model=Article
fields=('title','slug','review_num')
form_class=ArticleForm
4.模式三,使用form的clean()和clean_field()方法
如果我们希望验证form中的多个field,或者验证涉及到已经存在之后的数据,那么我们就需要用到form的clean()和clean_field()方法了.以下代码检查密码长度是否大于7位,并且password是否和password2相同:
#myapp/forms.py
fromdjangoimportforms
classMyUserForm(forms.Form):
username=forms.CharField()
password=forms.CharField()
password2=forms.CharField()
defclean_password(self):
password=self.cleaned_data['password']
iflen(password)=7:
raiseforms.ValidationError("passwordinsecure")
returnpassword
defclean():
cleaned_data=super(MyUserForm,self).clean()
password=cleaned_data.get('password','')
password2=cleaned_data.get('password2','')
ifpassword!=password2:
raiseforms.ValidationError("passwordsnotmatch")
returncleaned_data
其中需要注意的是,clean()和clean_field()的最后必须返回验证完毕或修改后的值.
5.模式四,自定义ModelForm中的field
我们会经常遇到在form中需要修改默认的验证,比如一个model中有许多非必填项,但为了信息完整,你希望这些field在填写时是必填的:
#myapp/models.py
fromdjango.dbimportmodels
classMyUser(models.Model):
username=models.CharField(max_length=100)
password=models.CharField(max_length=100)
address=models.TextField(blank=True)
phone=models.CharField(max_length=100,blank=True)
为了达到以上要求,你可能会通过直接增加field改写ModelForm:
#请不要这么做
#myapp/forms.py
fromdjangoimportforms
from.modelsimportMyUser
classMyUserForm(forms.ModelForm):
#请不要这么做
address=forms.CharField(required=True)
#请不要这么做
phone=forms.CharField(required=True)
classMeta:
model=MyUser
请不要这么做,因为这违反"不重复"的原则,而且经过多次的拷贝粘贴,代码会变得复杂难维护.正确的方式应当是利用__init__():
#myapp/forms.py
fromdjangoimportforms
from.modelsimportMyUser
classMyUserForm(forms.ModelForm):
def__init__(self,*args,**kwarg):
super(MyUserForm,self).__init__(*args,**kwargs)
self.fields['address'].required=True
self.fields['phone'].required=True
classMeta:
model=MyUser
值得注意的是,Djangoforms也是Python类,类可以继承和被继承,也可以动态修改.
GAE上试用Django表单验证框架,如何更改表单对应字段的标签Django的表单验证框架可以从数据模型自动生成HTML表单,还可在与数据存储区交互的同时无缝处理通过表单输入的信息。要在GoogleAppEngine上使用DjangoForms,参考这篇文章在使用过程中会遇到一个问题,比如你在定义一个数据模型Book,有两个字段name和pub_date分别表示书名和出版日期。如果使用DjangoForms自动生成Book的输入表单,表单呈现大体如下:Name:PubDate:问题是想把PubDate显示为更有意义的中文出版日期,该如何实现?
研究半天Django官方文档中关于Forms的部分,一点头绪都没有,只能放狗了,在反复尝试了各种关键字组合后,搜索djangoforms.Modelform终于找到了
DjangoModelForm:addinganaliastoafield
,顺便收藏一下StackOverflow:acollaborativelyeditedquestionandanswersiteforprogrammers–regardlessofplatformorlanguage,好像很有专业的样子。
其中第一种解决办法是利用原生的Django的方法:
仅需三步,为Djangoadmin增加登录验证码功能
首先,需要安装一个验证码的第三方库-django-simple-captcha,这是一个极其简单但可高度定制的Django第三方应用程序,用于将验证码图像添加到任何Django表单。
在项目的urls.py中注册刚才子类化的站点地址
终端启动站点
浏览器打开站点可以看到验证码已经添加成功了,但似乎样式不美观,这个就留给大家自己去研究吧,给个思路可以拷贝captcha默认的验证码模板,样式重写即可!
实现点击更换验证码功能
将如下代码加入到login.html模板的底部即可,别忘了引入Jquery.js哦!
到此大功告成,很简单的验证码功能就完成了!
下篇预告:django实现前后端分离登录功能,并加入验证码功能!
结语:以上就是首席CTO笔记为大家介绍的关于django表单验证怎么用和django图形验证码的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。