Django 框架之 自定义Forms

知识点

  1. 如何自定义表单
  2. 表单验证

简介

参考文档

代码地址:Spareibs的Github

实验步骤

非自定义表单

简单的Form处理方法

<h1>最原始的Form:全手工写</h1>
<form action="." method="post">
    {% csrf_token %}
    <label>增加诗词信息: </label>
    author:<input id="author" type="text" name="author" value="{[ author ]}">
    title:<input id="title" type="text" name="title" value="{[ title ]}">
    <input type="submit" value="OK">
</form>
from django.shortcuts import render, HttpResponseRedirect
from .models import Poem


def add(request):
    if request.method == 'POST':
        form = AddForm(request.POST)
        if not form.is_valid():
            print('invalid')
            return render(request, 'add_poem.html', {'form': AddForm()})
        author = form.cleaned_data['author']
        title = form.cleaned_data['title']
        poem = Poem(author=author, title=title)
        poem.save()
        return HttpResponseRedirect('/')
    else:
        return render(request, 'add_poem.html', {'form': AddForm()})

简单的Form处理方法 + 表单验证

前端和后端最后都要做一次校验

<h1>最原始的Form:全手工写+前端表单验证</h1>
<form action="." method="post">
    {% csrf_token %}
    <label>增加诗词信息: </label>
    author:<input id="author2" type="text" name="author" maxlength="10" minlength="1" value="{[ author ]}">
    title:<input id="title2" type="text" name="title" value="{[ title ]}">
    <input type="submit" value="OK">
</form>
from django.shortcuts import render, HttpResponseRedirect
from .models import Poem


def add(request):
    if request.method == 'POST':
        author = request.POST.get('author', "")
        len_author = len(author)
        if len_author < 1 or len_author > 10:
            return render(request, 'add_poem.html')
        title = request.POST.get('title', "")

        poem = Poem(author=author, title=title)
        poem.save()
        return HttpResponseRedirect('/')
    else:
        return render(request, 'add_poem.html')

自定义表单

简单实现自定义表单Froms.py

自定义一个表单【Froms.py】

from django import forms


class AddForm(forms.Form):
    author = forms.CharField(label="the author", min_length=1, max_length=10)
    title = forms.CharField()

将表单导入视图函数输出到模板【views.py】

from django.shortcuts import render, HttpResponseRedirect
from .models import Poem
from .forms import AddForm


def add(request):
    #表单验证
    if request.method == 'POST':
        author = request.POST.get('author', "")
        len_author = len(author)
        if len_author < 1 or len_author > 10:
            return render(request, 'add_poem.html')
        title = request.POST.get('title', "")

        poem = Poem(author=author, title=title)
        poem.save()
        return HttpResponseRedirect('/')
    else:
        return render(request, 'add_poem.html', {'form': AddForm()})

前端模板的使用
可以使用as_p或者as_label

<h1>自定义From表单</h1>
<p>{{ errors }}</p>
<form action="." method="post">
    {% csrf_token %}
    <label>增加诗词信息: </label>
    {{ form.as_table }}
    <input type="submit" value="OK">
</form>

优化表单视图函数

通过自定义类来获取数据【views.py】

from django.shortcuts import render, HttpResponseRedirect
from .models import Poem
from .forms import AddForm


# 使用自定义类来获取数据
    if request.method == 'POST':
        form = AddForm(request.POST)
        if not form.is_valid():
            print('invalid')
            return render(request, 'add_poem.html', {'form': AddForm()})
        author = form.cleaned_data['author']
        title = form.cleaned_data['title']
        poem = Poem(author=author, title=title)
        poem.save()
        return HttpResponseRedirect('/')
    else:
        return render(request, 'add_poem.html', {'form': AddForm()})

通过Models来自定义表单

Models的定义【Models.py】

from django.db import models

# Create your models here.
class Poem(models.Model):
    author = models.CharField(max_length=10)
    title = models.CharField(max_length=10)

自定义一个继承ModelForm表单【Froms.py】

from django import forms
from .models import Poem


# 通过models来自定义表单
class AddForm(forms.ModelForm):
    class Meta:
        model = Poem
        fields = ['author', 'title']

自定义表单的验证

通过Models.py来验证

Models的定义【Models.py】

from django.db import models
from django.core.validators import ValidationError


# 先定义一个用于验证的函数
def validate_pre(value):
    print('author validate_pre')
    if not value.startswith('a'):
        raise ValidationError('u must start with a', code='invalid')
class Poem(models.Model):
    # 在对应的字段中引用
    author = models.CharField(max_length=10, validators=[validate_pre])
    title = models.CharField(max_length=10)

通过Forms.py来验证

# ModelForm自定义表单 + 验证
class AddForm(forms.ModelForm):
    class Meta:
        model = Poem
        fields = ['author', 'title']
    
    # 仅用于测试,只能添加allen这个数据
    def clean_author(self):
        print('clean author')
        data = self.cleaned_data['author']
        if 'allen' not in data:
            raise ValidationError('not has allen')
        return data
# ModelForm自定义表单 + 验证
class AddForm(forms.ModelForm):
    class Meta:
        model = Poem
        fields = ['author', 'title']
    
    # 不允许数据重复
    def clean(self):
        print('clean')
        author = self.cleaned_data['author']
        title = self.cleaned_data['title']
        object = Poem.objects.filter(author=author, title=title)
        if object:
            raise ValidationError('dup')

问题

这里有个顺序问题,哪个优先
froms.py > models.py > views.py

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容