Django笔记&教程 6-3 使用模型(models)创建表单(form)

Django 自学笔记兼学习教程第6章第3节——使用模型(models)创建表单(form)
点击查看教程总目录

本文参考:Forms for models

1 - 初步介绍

很多时候,我们使用的表单,是与模型密切关联的(官方文档称之为紧密映射)。

比如注册学生账号,其表单与学生的模型字段基本是一一对应的。
这种情况下,自己一个一个去编辑设置表单的字段比较费事,而且如果模型中有字段修改,表单这边也要去修改。

在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段。
因此,Django提供了一个辅助类ModelForm,帮助您从Django模型创建表单类。

举个例子
比如我们在models.py有这样一个学生类

from django.db import models

class Student(models.Model):
    gender = [
        ("m", "男"),
        ("f", "女")
    ]

    name = models.CharField(max_length=50, verbose_name="姓名")
    gender = models.CharField(max_length=10, choices=gender, default='m', verbose_name="性别")
    birthday = models.DateField(verbose_name="生日")
    email = models.EmailField(verbose_name="邮箱")
    info = models.CharField(max_length=255, verbose_name="个人简介", help_text="一句话介绍自己,不要超过250字")

    grade = models.CharField(max_length=4, verbose_name="年级")
    number = models.CharField(max_length=6, verbose_name="年级子学号")
    password = models.CharField(max_length=30, verbose_name="密码")

我们要给这个学生类建立一个表单,用于在注册页面提交注册信息。
那么forms.py代码如下

from django import forms
from .models import Student

class StuRegisterForm(forms.ModelForm):

    class Meta:
        model = Student
        fields = ('grade',
                  'name',
                  'password',
                  'confirm_password',
                  'gender',
                  'birthday',
                  'email',
                  'info')

其中Meta是元数据类,用于去编辑设置一些更深层次的设置。
要使用一个模型来创建表单,则在Meta元数据类中指定对应的model属性

fields属性见本文第二部分

2 - 选择字段

对于和模型紧密映射的表单,有时我们不希望有些字段能够被用户编辑(比如一些需要后台按照逻辑去生成的字段)
这个时候我们可以使用:

  1. fields属性,设置哪些字段是可以让用户进行编辑的
  2. exclude属性,设置哪些字段是不让用户进行编辑的(用户在表单中也看不到这个字段)

上面两个属性一般使用列表(元组也可以),包含其需要指定的字段名。

fields属性可设置为特殊值'all',以指示应该使用模型中的所有字段

补充:如果你在模型字段上设置了edititable=False,那么通过ModelForm从模型创建的任何表单都不会包含该字段。

上一篇:13.home数据库设计


下一篇:Django REST framework+Vue 打造生鲜超市(二)