博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django框架全面讲解 -- Form
阅读量:4062 次
发布时间:2019-05-25

本文共 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
{#
#} {
{ form.user }} {% if error.user.0 %}
{
{ error.user.0 }}
{% endif %}
{#
#} {
{ form.pwd }} {% if error.pwd.0 %}
{
{ error.pwd.0 }}
{% endif %}
{
{ form.email }} {% if error.email.0 %}
{
{ error.email.0 }}
{% endif %}
{
{ form.memo }} {% if error.memo.0 %}
{
{ error.memo.0 }}
{% endif %}
{
{ form.book_type }} {% if error.book_type.0 %}
{
{ error.book_type.0 }}
{% endif %}

扩展: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/

你可能感兴趣的文章
ZUUL2 使用场景
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
elastic-job 和springboot 集成干货
查看>>
php开发微服务注册到eureka中(使用sidecar)
查看>>
mybatis mybatis plus mybatis jpa hibernate spring data jpa比较
查看>>
支付宝生活号服务号 用户信息获取 oauth2 登录对接 springboot java
查看>>
CodeForces #196(Div. 2) 337D Book of Evil (树形dp)
查看>>
uva 12260 - Free Goodies (dp,贪心 | 好题)
查看>>
uva-1427 Parade (单调队列优化dp)
查看>>
【设计模式】学习笔记13:组合模式(Composite)
查看>>
hdu 1011 Starship Troopers (树形背包dp)
查看>>
hdu 1561 The more, The Better (树形背包dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>
Windows下安装ElasticSearch6.3.1以及ElasticSearch6.3.1的Head插件
查看>>
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>