前言:
为什么要用form去验证呢?
我们提交的是form表单,在看前端源码时如果检查到POST URL及我们提交的字段,如果没有验证我们是否可以直接POST数据到URL,后台并没有进行校验,直接处理,那样会不会对我们系统产生影响?答案是肯定的,FORM的作用就是起到一定的数据保护作用加一层校验将不合法数据丢弃
1.针对上一章 django form表单验证 补充
form表单补充,select框
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
from django import forms
from django.core.exceptions import ValidationError
def phone_validate(value):
phone_re = re.compile(r'^(13[0-9]|15[012356789]|17[0678]|18[0-9]|14[57])[0-9]{8}$')
if not phone_re.match(value):
raise ValidationError('手机号码格式错误')
class TestForm(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"}))
注:
widget 生成前端展示 .SELECT选择下拉框,attrs属性class前端显示类
二. 通过model form来自定义表单
1. 字段类型
生成的表单类中将具有和指定的模型字段对应的表单字段,顺序为fields 属性中指定的顺序。
| Form field | |
|---|---|
| AutoField | Not represented in the form |
| BigIntegerField | IntegerField with min_value set to -9223372036854775808 and max_value set to 9223372036854775807. |
| BooleanField | BooleanField |
| CharField | CharField with max_length set to the model field’s max_length |
| CommaSeparatedIntegerField | CharField |
| DateField | DateField |
| DateTimeField | DateTimeField |
| DecimalField | DecimalField |
| EmailField | EmailField |
| FileField | FileField |
| FilePathField | FilePathField |
| FloatField | FloatField |
| ForeignKey | ModelChoiceField (see below) |
| ImageField | ImageField |
| IntegerField | IntegerField |
| IPAddressField | IPAddressField |
| GenericIPAddressField | GenericIPAddressField |
| ManyToManyField | ModelMultipleChoiceField (see below) |
| NullBooleanField | NullBooleanField |
| PositiveIntegerField | IntegerField |
| PositiveSmallIntegerField | IntegerField |
| SlugField | SlugField |
| SmallIntegerField | IntegerField |
| TextField | CharField with widget=forms.Textarea |
| TimeField | TimeField |
| URLField | URLField |
完整示例:
1. 数据模型
创建:
1 from django.db import models 2 3 4 # Create your models here. 5 6 7 class Publisher(models.Model): 8 name = models.CharField(max_length=30, unique=True) 9 address = models.CharField(max_length=50) 10 city = models.CharField(max_length=60) 11 state_province = models.CharField(max_length=60) 12 country = models.CharField(max_length=60) 13 website = models.URLField() 14 15 def __str__(self): 16 return self.name 17 18 19 class Author(models.Model): 20 first_name = models.CharField(max_length=32) 21 last_name = models.CharField(max_length=32) 22 email = models.EmailField() 23 24 def __str__(self): 25 name = self.first_name + self.last_name 26 return name 27 28 29 class Book(models.Model): 30 name = models.CharField(max_length=128) 31 authors = models.ManyToManyField(Author) 32 publisher = models.ForeignKey(Publisher) 33 publish_date = models.DateField() 34 35 def __str__(self): 36 return self.authors