【20.6】Django框架Form组件之模型表单ModelForm

【一】引入

  • 如果你正在构建一个数据库驱动的应用,那么你可能会有与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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值