Django 三—— Form组件

内容概要:

1.Django Form如何自定义验证字段

2.Django Form如何动态的显示数据库中新插入的数据

3.Tyrion


Django的Form(用于验证用户请求合法性的一个组件)

Django的Form主要具有一下几大功能:

  • 生成HTML标签
  • 验证用户数据(显示错误信息),判断字段类型、长度、格式是否正确
  • 保留页面信息
  • 设置页面显示的初始化内容

1.如何自定义验证字段

自定制验证:

  • 单一字段  def clean_字段名(self):
  • 组合字段  def _post_clean(self):
  • 组合字段  def clean(self):

 forms.py中

#专门建forms.py文件,用于放各个模块的字段
from django import forms
from django.core.exceptions import ValidationError
from django.forms import fields


class UserForm(forms.Form):
    # username = forms.CharField(max_length=32)  forms.或者fields.都可以
    username = fields.CharField(max_length=32,label='用户名')
    email = fields.EmailField(label='邮箱')

    '''
    # 自定义验证规则方法一: 可以自定义方法来验证 单个字段 在错误信息级别进行详细的定制,但是它实际最基础的验证还是已经在forms.Form中已经完成:
    # forms模块内部有   clean_字段名()  方法,所以可以这样自定义验证:
    def clean_username(self):
        value = self.cleaned_data['username']
        if value =='root':
            return value
        else:
            raise ValidationError('你不是管理员。。。')  #主动跑出异常让error接收,必须带参数
    '''
    '''
    #自定义验证规则方法二:可以自定义_post_clean(self)或者clean() 方法来验证 多个字段组合错误 在错误信息级别进行详细的定制使用_post_clean()
    def _post_clean(self):
        v1 = self.cleaned_data['username']
        v2 = self.cleaned_data['email']
        if v1 =='root' and v2 == 'root@live.com': #用户名或密码不匹配时会报  KeyError 错误
            pass
        else:
            self.add_error('__all__',ValidationError('用户名或邮箱错误。。。')) #仿造_clean_fields(self)函数写的
            #必须是  __all__,否则出不来
    '''
     # 自定义验证规则方法三: clean() 方法来验证 多个字段组合错误,这样重写clean()方法后,clean里面的数据就不是正确数据了,而数据在cleaned_data里面了
    def clean(self):
        v1 = self.cleaned_data['username']
        v2 = self.cleaned_data['email']
        if v1 == 'root' and v2 == 'root@live.com':  # 用户名或密码不匹配时会报  KeyError 错误
            pass
        else:
            raise ValidationError('用户名或邮箱错误!!!')
        return self.cleaned_data

  views文件夹 ==>fm.py中

from django.shortcuts import render

from app01 import forms  #引入forms.py模块
def index(request):
    if request.method =='GET':
        obj = forms.UserForm()
        return render(request,'fm.html',{'obj':obj})
    elif request.method =='POST':
        obj = forms.UserForm(request.POST)
        # 以前的做法:
        if obj.is_valid():
            data = obj.clean()
            # print(data)
        else:
            print(obj.errors)
            # print(obj.cleaned_data)  自定义验证规则方法三: 改写 clean() 方法来验证 多个字段组合错误,这样重写clean()方法后,
            # clean里面的数据就不是正确数据了,而数据在cleaned_data里面了
        return render(request, 'fm.html', {'obj': obj})

  fm.html中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#方式一:#}
{#    {{ obj.username }}#}
{#    {{ obj.email }}#}
{#方式二:将obj里面的每一个对象简单粗暴的分别以**标签展示#}
{#    {{ obj.as_p }}#}
{#    {{ obj.as_ul }}#}
{#<table>#}
{#    {{ obj.as_table }}#}
{#</table>#}
<form method="post" action="/fm/">
    {% csrf_token %}
    {{ obj.as_p }}
    <input type="submit" value="提交">
</form>
</body>
</html>

  urls.py中

from django.conf.urls import url
from django.contrib import admin
from app01.views import fm

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^fm/', fm.index),
]

 2.如何动态的显示数据库中新插入的数据?

定义init方法,先继承执行父类方法,再从数据库中取值

在forms.py文件中

'''
专门建forms.py文件,用于放各个模块的字段
内容概要:
1.自定义验证规则
2.如何实时同步数据库数据
'''
from django import forms
from django.core.exceptions import ValidationError
from django.forms import fields
from app01 import models


class UserForm(forms.Form):
    # username = forms.CharField(max_length=32)  forms.或者fields.都可以
    username = fields.CharField(max_length=32,label='用户名')
    email = fields.EmailField(label='邮箱')

    user_type = fields.ChoiceField(choices=models.UserType.objects.values_list('id', 'name'))

    # 例如:让其user_type数据  实时更新  的方法,定义init方法,先继承执行父类方法,再从数据库中取值:
    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, **kwargs)
        self.fields['user_type'].widget.choices = models.UserType.objects.all().values_list('id', 'name')

  

form组件  补充知识:http://www.cnblogs.com/wupeiqi/articles/6144178.html

Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado、Django、Flask、Bottle Web框架。

http://www.cnblogs.com/wupeiqi/p/5938916.html

原文地址:https://www.cnblogs.com/tangtingmary/p/8046025.html