首页>>后端>>Python->django表单验证怎么用(django图形验证码)

django表单验证怎么用(django图形验证码)

时间:2023-11-30 本站 点击:0

本篇文章首席CTO笔记来给大家介绍有关django表单验证怎么用以及django图形验证码的相关内容,希望对大家有所帮助,一起来看看吧。

本文目录一览:

1、如何正确使用 Django Forms2、GAE上试用Django表单验证框架,如何更改表单对应字段的标签3、仅需三步,为Django admin增加登录验证码功能

如何正确使用 Django Forms

1. Django Forms的强大之处

有些django项目并不直接呈现HTML, 二是以API框架的形式存在, 但你可能没有想到, 在这些API形式的django项目中也用到了django forms. django forms不仅仅是用来呈现HTML的, 他们最强的地方应该是他们的验证能力. 下面我们就介绍几种和Django forms结合使用的模式:

2. 模式一: ModelForm和默认验证

最简单的使用模式便是ModelForm和model中定义的默认验证方式的组合:

# myapp/views.py

from django.views.generic import CreateView, UpdateView

from braces.views import LoginRequiredMixin

from .models import Article

class ArticleCreateView(LoginRequiredMixin, CreateView):

model = Article

fields = ('title', 'slug', 'review_num')

class ArticleUpdateView(LoginRequiredMixin, UpdateView):

model = Article

fields = ('title', 'slug', 'review_num')

正如以上代码中看到的一样:

ArticleCreateView和ArticleUpdateView中设置model为Article

两个view都基于Article model自动生成了ModelForm

这些ModelForm的验证, 是基于Article model中定义的field转换而来的

3. 模式二, 在ModelForm中修改验证

在上面的例子中, 如果我们希望每篇article title的开头都是"new", 那么应该怎么做呢? 首先我们需要建立自定义的验证(validator):

# utils/validator.py

from django.core.exceptions import ValidationError

def validate_begins(value):

if not value.startswith(u'new'):

raise ValidationError(u'Must start with new')

可见, 在django中的验证程序就是不符合条件便抛出ValidationError的function, 为了方便重复使用, 我们将它们放在django app utils的validators.py中.

接下来, 我们可以在model中加入这些validator, 但为了今后的方便修改和维护, 我们更倾向于加入到ModelForm中:

# myapp/forms.py

from django import forms

from utils.validators import validate_begin

from .models import Article

class ArticleForm(forms.ModelForm):

dev __init__(self, *args, **kwargs):

super(ArticleForm, self).__init__(8args, **kwargs)

self.fields["title"].validators.append(validate_begin)

class Meta:

model = Article

Django的edit views(UpdateView和CreateView等)的默认行为是根据view中model属性, 自动创建ModelForm. 因此, 我们需要调用我们自己的Modelform来覆盖自动创建的:

# myapp/views.py

from django.views.generic import CreateView, UpdateView

from braces.views import LoginRequiredMixin

from .models import Article

from .forms import ArticleForm

class ArticleCreateView(LoginRequiredMixin, CreateView):

model = Article

fields = ('title', 'slug', 'review_num')

form_class = ArticleForm

class ArticleUpdateView(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

from django import forms

class MyUserForm(forms.Form):

username = forms.CharField()

password = forms.CharField()

password2 = forms.CharField()

def clean_password(self):

password = self.cleaned_data['password']

if len(password) = 7:

raise forms.ValidationError("password insecure")

return password

def clean():

cleaned_data = super(MyUserForm, self).clean()

password = cleaned_data.get('password', '')

password2 = cleaned_data.get('password2', '')

if password != password2:

raise forms.ValidationError("passwords not match")

return cleaned_data

其中需要注意的是, clean()和clean_field()的最后必须返回验证完毕或修改后的值.

5. 模式四, 自定义ModelForm中的field

我们会经常遇到在form中需要修改默认的验证, 比如一个model中有许多非必填项, 但为了信息完整, 你希望这些field在填写时是必填的:

# myapp/models.py

from django.db import models

class MyUser(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

from django import forms

from .models import MyUser

class MyUserForm(forms.ModelForm):

# 请不要这么做

address = forms.CharField(required=True)

# 请不要这么做

phone = forms.CharField(required=True)

class Meta:

model = MyUser

请不要这么做, 因为这违反"不重复"的原则, 而且经过多次的拷贝粘贴, 代码会变得复杂难维护. 正确的方式应当是利用__init__():

# myapp/forms.py

from django import forms

from .models import MyUser

class MyUserForm(forms.ModelForm):

def __init__(self, *args, **kwarg):

super(MyUserForm, self).__init__(*args, **kwargs)

self.fields['address'].required = True

self.fields['phone'].required = True

class Meta:

model = MyUser

值得注意的是, Django forms也是Python类, 类可以继承和被继承, 也可以动态修改.

GAE上试用Django表单验证框架,如何更改表单对应字段的标签

Django的表单验证框架可以从数据模型自动生成HTML表单,还可在与数据存储区交互的同时无缝处理通过表单输入的信息。要在Google App Engine上使用Django Forms,参考这篇文章在使用过程中会遇到一个问题,比如你在定义一个数据模型Book,有两个字段name和pub_date分别表示书名和出版日期。如果使用Django Forms自动生成Book的输入表单,表单呈现大体如下:Name:Pub Date:问题是想把Pub Date显示为更有意义的中文出版日期,该如何实现?

研究半天Django官方文档中关于Forms的部分,一点头绪都没有,只能放狗了,在反复尝试了各种关键字组合后,搜索djangoforms.Modelform终于找到了

Django ModelForm: adding an alias to a field

,顺便收藏一下Stack Overflow:a collaboratively edited question and answer site for programmers – regardless of platform or language,好像很有专业的样子。

其中第一种解决办法是利用原生的Django的方法:

仅需三步,为Django admin增加登录验证码功能

首先,需要安装一个验证码的第三方库-django-simple-captcha,这是一个极其简单但可高度定制的 Django 第三方应用程序,用于将验证码图像添加到任何 Django 表单。

在项目的urls.py中注册刚才子类化的站点地址

终端启动站点

浏览器打开站点可以看到验证码已经添加成功了,但似乎样式不美观,这个就留给大家自己去研究吧,给个思路可以拷贝captcha默认的验证码模板,样式重写即可!

实现点击更换验证码功能

将如下代码加入到login.html模板的底部即可,别忘了引入Jquery.js哦!

到此大功告成,很简单的验证码功能就完成了!

下篇预告 :django实现前后端分离登录功能,并加入验证码功能!

结语:以上就是首席CTO笔记为大家介绍的关于django表单验证怎么用和django图形验证码的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/4648.html