Django ModelForm – 从模型创建表单
Django ModelForm是一个用于直接将模型转换为Django表单的类。如果你正在构建一个数据库驱动的应用程序,你很可能会有与Django模型紧密对应的表单。例如,一个用户注册模型和表单会有相同质量和数量的模型字段和表单字段。因此,我们可以直接使用ModelForm,而不是创建一个多余的代码,首先创建一个表单,然后在视图中把它映射到模型上。它将模型的名称作为参数,并将其转换为Django表单。不仅如此,ModelForm还提供了很多方法和功能,使整个过程自动化,有助于消除代码冗余。
如何将一个模型转换为Django表单
为了解释项目的工作,我们将使用项目geeksforgeeks,创建一个模型并将其映射到Django表单。
现在,当我们的项目准备好了,在geeks/models.py中创建一个模型。
在我们创建一个模型之前,让我们在主项目中注册我们的应用程序。进入geeksforgeeks/settings.py文件,在INSTALLED_APPS列表中添加geeks应用程序。如果我们在这一步之前做了迁移,它将显示一条消息,说没有做任何改动。
现在,运行以下命令来创建模型。
我们可以在http://127.0.0.1:8000/admin/geeks/geeksmodel/add/,
检查模型是否已经成功创建,潜入geeks/forms.py并输入以下代码。
这个表格需要两个参数字段或排除。
- 字段 – 强烈建议你使用字段属性明确设置所有应该在表单中编辑的字段。如果不这样做,当表单意外地允许用户设置某些字段时,很容易导致安全问题,特别是当新字段被添加到一个模型中时。根据表单的渲染方式,这个问题甚至可能在网页上不可见。将字段属性设置为特殊值’all‘,表示模型中的所有字段都应该被使用。
- exclude – 将ModelForm内部Meta类的exclude属性设置为一个要从表单中排除的字段列表。例如。
最后,为了完成我们的MVT结构,创建一个视图来渲染表单并直接将其保存到数据库。在geeks/views.py中。
一切都设置好了,现在访问http://127.0.0.1:8000/ ,现在你可以看到每一个模型字段都被映射成一个表单字段并相应地显示出来。字段映射将在本文的后面讨论。所以现在让我们试着在表单中输入数据并检查它是否被保存到数据库中。
Field types
生成的表单类将为每个指定的模型字段有一个表单字段,按照字段属性中指定的顺序。每个模型字段都有一个相应的默认表单字段。例如,一个模型上的CharField在表单上被表示为CharField。一个模型的ManyToManyField被表示为一个MultipleChoiceField。下面是转换的完整列表。
模型字段 | 表格字段 |
---|---|
AutoField | 在表格中不表示 |
BigAutoField | 在表格中不表示 |
BigIntegerField | IntegerField,min_value设置为-9223372036854775808,max_value设置为9223372036854775807。 |
BinaryField | CharField,如果模型字段上的可编辑性被设置为True,否则不在表单中表示。 |
BooleanField | BooleanField,如果null=True,则为NullBooleanField。 |
CharField | CharField,max_length设置为模型字段的max_length,如果null=True, empty_value设置为None。 |
DateField | DateField |
DateTimeField | DateTimeField |
DecimalField | DecimalField |
DurationField | DurationField |
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 |
SmallAutoField | 在表格中不表示。 |
TextField | CharField with widget=forms.Textarea |
TimeField | TimeField |
URLField | URLField |