【一】引入
- 如果你正在构建一个数据库驱动的应用,那么你可能会有与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 |
| ManyToManyF |

最低0.47元/天 解锁文章
486

被折叠的 条评论
为什么被折叠?



