Django ModelForm – 从模型创建表单

Django ModelForm – 从模型创建表单

Django ModelForm是一个用于直接将模型转换为Django表单的类。如果你正在构建一个数据库驱动的应用程序,你很可能会有与Django模型紧密对应的表单。例如,一个用户注册模型和表单会有相同质量和数量的模型字段和表单字段。因此,我们可以直接使用ModelForm,而不是创建一个多余的代码,首先创建一个表单,然后在视图中把它映射到模型上。它将模型的名称作为参数,并将其转换为Django表单。不仅如此,ModelForm还提供了很多方法和功能,使整个过程自动化,有助于消除代码冗余。

如何将一个模型转换为Django表单

为了解释项目的工作,我们将使用项目geeksforgeeks,创建一个模型并将其映射到Django表单。

现在,当我们的项目准备好了,在geeks/models.py中创建一个模型。

# import the standard Django Model
# from built-in library
from django.db import models
  
# declare a new model with a name "GeeksModel"
class GeeksModel(models.Model):
        # fields of the model
    title = models.CharField(max_length = 200)
    description = models.TextField()
    last_modified = models.DateTimeField(auto_now_add = True)
    img = models.ImageField(upload_to = "images/")
  
        # renames the instances of the model
        # with their title name
    def __str__(self):
        return self.title

在我们创建一个模型之前,让我们在主项目中注册我们的应用程序。进入geeksforgeeks/settings.py文件,在INSTALLED_APPS列表中添加geeks应用程序。如果我们在这一步之前做了迁移,它将显示一条消息,说没有做任何改动。

现在,运行以下命令来创建模型。

Python manage.py makemigrations
Python manage.py migrate

我们可以在http://127.0.0.1:8000/admin/geeks/geeksmodel/add/,

Django ModelForm - 从模型创建表单

检查模型是否已经成功创建,潜入geeks/forms.py并输入以下代码。

# import form class from django
from django import forms
 
# import GeeksModel from models.py
from .models import GeeksModel
 
# create a ModelForm
class GeeksForm(forms.ModelForm):
    # specify the name of model to use
    class Meta:
        model = GeeksModel
        fields = "__all__"

这个表格需要两个参数字段或排除。

  • 字段 – 强烈建议你使用字段属性明确设置所有应该在表单中编辑的字段。如果不这样做,当表单意外地允许用户设置某些字段时,很容易导致安全问题,特别是当新字段被添加到一个模型中时。根据表单的渲染方式,这个问题甚至可能在网页上不可见。将字段属性设置为特殊值’all‘,表示模型中的所有字段都应该被使用。
  • exclude – 将ModelForm内部Meta类的exclude属性设置为一个要从表单中排除的字段列表。例如。
class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ['title']

最后,为了完成我们的MVT结构,创建一个视图来渲染表单并直接将其保存到数据库。在geeks/views.py中。

from django.shortcuts import render
from .forms import GeeksForm
 
def home_view(request):
    context ={}
 
    # create object of form
    form = GeeksForm(request.POST or None, request.FILES or None)
     
    # check if form data is valid
    if form.is_valid():
        # save the form data to model
        form.save()
 
    context['form']= form
    return render(request, "home.html", context)

Django ModelForm - 从模型创建表单

一切都设置好了,现在访问http://127.0.0.1:8000/ ,现在你可以看到每一个模型字段都被映射成一个表单字段并相应地显示出来。字段映射将在本文的后面讨论。所以现在让我们试着在表单中输入数据并检查它是否被保存到数据库中。

Django ModelForm - 从模型创建表单

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程