【一】引入
- 如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单。
- 比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中。
- 在这种情况下,写一个forms.Form类,然后在表单类中定义字段,这种一般创建表单的做法是冗余的,因为你已经在ORM模型model中定义了字段的属性和功能,完全没必要重新写一遍字段。
【二】核心用法
- 基于这个原因,Django提供一个辅助类帮助我们利用Django的ORM模型model创建Form。
from django.forms import ModelForm
from myapp.models import Article
# 创建表单类
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['pub_date', 'headline', 'content', 'reporter']
# 创建一个表单,用于添加文章
form = ArticleForm()
# 创建表单修改已有的文章
article = Article.objects.get(pk=1)
form = ArticleForm(instance=article)
-
用法的核心是:
-
首先从django.forms导入ModelForm;
-
编写一个自己的类,继承ModelForm;
-
在新类里,设置元类Meta;
-
在Meta中,设置model属性为你要关联的ORM模型,这里是Article;
-
在Meta中,设置fields属性为你要在表单中使用的字段列表;
-
列表里的值,应该是ORM模型model中的字段名。
-
-
上面的例子中,因为model和form比较简单,字段数量少,看不出这么做的威力和效率。
-
但如果是那种大型项目,每个模型的字段数量几十上百,这么做的收益将非常巨大,而且后面还有一招提高效率的大杀器,也就是一步保存数据的操作。
【三】字段类型
- 生成的Form类中将具有和指定的模型字段对应的表单字段,顺序为fields属性列表中指定的顺序。
- 每个模型字段有一个对应的默认表单字段。
- 比如,模型中的CharField表现成表单中的CharField。
- 模型中的ManyToManyField字段会表现成MultipleChoiceField字段。下面是完整的映射列表:
模型字段 | 表单字段 |
---|---|
AutoField | 在Form类中无法使用 |
BigAutoField | 在Form类中无法使用 |
BigIntegerField | IntegerField,最小-9223372036854775808,最大9223372036854775807. |
BooleanField | BooleanField |
CharField | CharField,同样的最大长度限制。如果model设置了null=True,Form将使用empty_value |
CommaSeparatedIntegerField | CharField |
DateField | DateField |
DateTimeField | DateTimeField |
DecimalField | DecimalField |
EmailField | EmailField |
FileField | FileField |
FilePathField | FilePathField |
FloatField | FloatField |
ForeignKey | ModelChoiceField |
ImageField | ImageField |
IntegerField | IntegerField |
IPAddressField | IPAddressField |
GenericIPAddressField | GenericIPAddressField |
ManyToManyField | ModelMultipleChoiceField |
NullBooleanField | NullBooleanField |
PositiveIntegerField | IntegerField |
PositiveSmallIntegerField | IntegerField |
SlugField | SlugField |
SmallI |