Django2.2丨从模型创建表单

ModelForm

Django提供了一个辅助类可以从一个Django模型创建一个Form类

示例

>>> from django.forms import ModelForm
>>> from myapp.models import Article

# Create the form class.
>>> class ArticleForm(ModelForm):
...     class Meta:
...         model = Article
...         fields = ['pub_date', 'headline', 'content', 'reporter']

# Creating a form to add an article.
>>> form = ArticleForm()

# Creating a form to change an existing article.
>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)

字段类型

生成的Form类将按照fields属性中指定的顺序为每个指定的模型字段设置一个表单字段。

每个模型字段都有一个对应的默认表单字段。

  • ForeignKey由django.forms.ModelChoiceField表示,是一个ChoiceField,其选项是一个模型的QuerySet。

  • ManyToManyField由django.forms.ModelMultipleChoiceField表示,是一个MultipleChoiceField,其选项为一个模型QuerySet。

每个生成的表单字段的属性设置:

  • 如果模型字段设置了blank=Ture,那么表单字段的required属性被设置为False,否则required=True。

  • 表单字段的label设置为模型字段的verbose_name,并且首字母大写。

  • 表单字段的hepl_text设置为模型字段的help_text

  • 如果模型字段设置了choices,那么表单字段的widget会被设置为Select,其选项来自模型字段的choices。

示例

from django.db import models
from django.forms import ModelForm

TITLE_CHOICES = [
    ('MR', 'Mr.'),
    ('MRS', 'Mrs.'),
    ('MS', 'Ms.'),
]

class Author(models.Model):
    name = models.CharField(max_length=100)
    title = models.CharField(max_length=3, choices=TITLE_CHOICES)
    birth_date = models.DateField(blank=True, null=True)

    def __str__(self):
        return self.name

class Book(models.Model):
    name = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ['name', 'title', 'birth_date']

class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ['name', 'authors']

验证ModelForm

验证ModelForm主要涉及两个步骤

  • 验证表单
  • 验证模型实例

覆盖clean()方法

可以重写模型表单上的clean()方法来提供额外的验证。

save()方法

每个ModelForm还有一个save()方法。此方法根据绑定到表单的数据创建并保存数据库对象。

ModelForm的子类可接受一个现有的模型实例作为关键字参数instance;如果提供了,则save()会更新这个实例。如果没有,则save()会创建一个对应模型的新实例。

>>> from myapp.models import Article
>>> from myapp.forms import ArticleForm

# Create a form instance from POST data.
>>> f = ArticleForm(request.POST)

# Save a new Article object from the form's data.
>>> new_article = f.save()

# Create a form to edit an existing Article, but use
# POST data to populate the form.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(request.POST, instance=a)
>>> f.save()

save()方法接受一个可选参数commit,它的值是True或者False。False情况下,会返回一个尚未保存到数据库的对象。

选择要使用的字段

  • fields属性设置为特殊值"_all_"以表明需要使用模型中的所有字段

示例

from django.forms import ModelForm

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = '__all__'
  • 将ModelForm中Meta类的exclude属性设置为表单中需要排除的字段列表。

示例

class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ['title']

版权声明:本文为m0_45198298原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。