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']