Django的forms组件使用

forms组件

  • 校验字段功能
  • 渲染标签功能
  • 渲染错误信息功能
  • 组件的参数配置
  • 局部钩子(能走到它,说明前面校验已经通过了,一定能把该字段的值取出来)
  • 全局钩子(能走到它,前面的全都执行过了,包括局部钩子)在做密码判断的时候,一定要注意,可能密码取出来为空
models.py
class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    email=models.EmailField()
模板文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<div class="container">
    {#    <div class="row">#}
    {#        <div class="col-md-6 col-md-offset-3">#}
    {#            <form action="" method="post" class="form-group">#}
    {#                用户名:<input type="text" name="name" class="form-control"> <br>#}
    {#                密码: <input type="password" name="pwd" class="form-control"> <br>#}
    {#                确认密码: <input type="password" name="re_pwd" class="form-control"> <br>#}
    {#                邮箱: <input type="email" name="email" class="form-control"> <br>#}
    {#                <button>提交</button>#}
    {#            </form>#}
    {#        </div>#}
    {#    </div>#}

    <hr>
    <h1 class="text-center">渲染页码方式一</h1>
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post">
                {{ obj.name.label }}:{{ obj.name }} <span>{{ obj.errors.0 }}</span> <br>
                {{ obj.pwd.label }}:{{ obj.pwd }} <span>{{ obj.errors.0 }}</span> <br>
                {{ obj.re_pwd.label }}:{{ obj.re_pwd }} <span>{{ obj.errors.0 }} {{ errors }}</span> <br>
                {{ obj.email.label }}:{{ obj.email }} <span>{{ obj.errors.0 }}</span> <br>
                <button>提交</button>
            </form>
        </div>
    </div>

    <hr>

    <h1 class="text-center">渲染页码方式二(for循环form对象)</h1>
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post" class="form-group">
                {% for foo in obj %}
                    {{ foo.label }}{{ foo }} <span>{{ foo.errors }}</span> <br>
                {% endfor %}
                <button>提交</button>
            </form>
        </div>
    </div>

    {#    <hr>#}
    {#    <h1>渲染页码方式三(不建议用,不易拓展)</h1>#}
    {#    <form action="" method="post">#}
    {#        {{ obj.as_p }}#}
    {#        <button>提交</button>#}
    {#    </form>#}
</div>
</body>
</html>
视图文件
from django.shortcuts import render, HttpResponse, redirect
from app01.models import *
from django import forms
from django.forms import widgets
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError

class RegForm(forms.Form):
    name = forms.CharField(max_length=10,
                           min_length=2,
                           label='用户名',
                           error_messages={
                               'required': '该字典必填',
                               'max_length': '太长了',
                               'min_length': '太短了'
                           },
                           widget=widgets.TextInput(attrs={'class':'form-control'}))

    pwd = forms.CharField(max_length=10,
                          min_length=2,
                          label='密码',
                          widget=widgets.PasswordInput(attrs={'class':'form-control'}))

    re_pwd = forms.CharField(max_length=10,
                             min_length=2,
                             label='确认密码',
                             widget=widgets.PasswordInput(attrs={'class':'form-control'}))

    email = forms.EmailField(label='邮箱',
                             error_messages={
                                 'invalid': '不符合邮箱格式'
                             },
                             widget=widgets.EmailInput(attrs={'class':'form-control'}))

    # 局部钩子(多了一个我自己写校验规则的方式)
    def clean_name(self):
        name = self.cleaned_data.get('name')
        user = UserInfo.objects.filter(name=name).first()
        if user:
            raise ValidationError('用户已存在')
        else:
            if name.startswith('sb'):
                raise ValidationError('不能以sb开头')
            return name

    # 全局钩子
    def clean(self):
        pwd = self.cleaned_data.get('pwd')
        re_pwd = self.cleaned_data.get('re_pwd')
        if pwd and re_pwd:
            if pwd == re_pwd:
                return self.cleaned_data
            else:
                raise ValidationError('密码不一致')

# def form_test(request):
# form没有的字段不会被校验,一旦校验通过,cleaned_data里面也没有这个字段
# form有的字段如果不传,一定校验不通过
# obj = RegForm({'name':'l','password':'12','email':'30@qq.com'})
# 返回一个布尔类型,True代表里面所有字段都校验通过
# print(obj.is_valid())
# if obj.is_valid():
# 校验通过的字段放在里面
# print('cleaned_data:',obj.cleaned_data)
# else:
#     print('errors:',obj.errors)
#     print(obj.errors.get('name')[0])
#     print('errors_type:',type(obj.errors))
#     from django.forms.utils import ErrorDict
# return render(request,'form_test.html')


def form_test(request):
    obj = RegForm()
    if request.method == 'POST':
        obj = RegForm(request.POST)
        if obj.is_valid():
            # 把字典打散为关键字形式
            UserInfo.objects.create(**obj.cleaned_data)
            # return HttpResponse('ok')
        else:
            print(obj.errors.as_data())
            errors = obj.errors.get('__all__','')
            # print(obj['name'].errors.as_data())
            # return HttpResponse('失败')
    return render(request, 'form_test.html', locals())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值