Django ModelForm是用于直接将模型转换为Django形式的类。如果你要构建数据库驱动的应用程序, 那么你的表格很可能会与Django模型紧密映射。例如, 用户注册模型和表单将具有相同数量和质量的模型字段和表单字段。因此, 我们可以直接使用ModelForm, 而无需创建多余的代码来先创建表单, 然后将其映射到视图中的模型。它以模型名称作为参数并将其转换为Django Form。不仅如此, ModelForm还提供了许多使整个过程自动化的方法和功能, 并有助于消除代码冗余。
如何将模型转换为Django表单?
为了解释项目的工作, 我们将使用项目极客, 创建一个模型并将其映射到Django表单。
请参阅以下文章, 以检查如何在Django中创建项目和应用。如何在Django中使用MVT创建基本项目?如何在Django中创建应用程序?
现在, 当我们准备好项目后, 在怪胎/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现在, 运行以下命令来创建模型,
Python manage.py makemigrations
Python manage.py migrate我们可以在以下位置检查是否已成功创建模型
http://127.0.0.1:8000/admin/geeks/geeksmodel/add/
,
 
 
要直接为此模型创建表单, 请深入研究怪胎/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__"这种形式有两个参数领域or排除.
字段–强烈建议你使用fields属性来显式设置应在表单中编辑的所有字段。如果表单意外地允许用户设置某些字段, 特别是在将新字段添加到模型中时, 这样做失败很容易导致安全问题。根据表单的呈现方式, 问题甚至可能在网页上不可见。将fields属性设置为特殊值" __all__", 以指示应使用模型中的所有字段。
排除–
将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)一切就绪, 现在访问
http://127.0.0.1:8000/
,
 
 
现在, 你可以看到每个模型字段都映射到一个表单字段并相应显示。字段映射将在本文后面讨论。因此, 现在让我们尝试将数据输入表单, 并检查是否将其保存到数据库中。
 
 
点击提交, 宾果游戏表格自动保存到数据库。我们可以在
http:// localhost:8000/admin/geeks/geeksmodel /
.
 
 
栏位类型
生成的Form类将为每个指定的模型字段都具有一个field字段, 并以fields属性中指定的顺序。每个模型字段都有一个对应的默认表单字段。例如, 模型上的CharField表示为表单上的CharField。模型ManyToManyField表示为MultipleChoiceField。以下是转换的完整列表:
| 模型领域 | 表格栏位 | 
|---|---|
| AutoField | 不以形式表示 | 
| BigAutoField | 不以形式表示 | 
| BigIntegerField | IntegerField, 其min_value设置为-9223372036854775808, max_value设置为9223372036854775807。 | 
| BinaryField | CharField, 如果在模型字段上将editable设置为True, 则在表单中不表示。 | 
| BooleanField | BooleanField, 如果null = True, 则为NullBooleanField。 | 
| CharField | 如果null = True, 则将max_length设置为模型字段的max_length, 并将empty_value设置为None的CharField。 | 
| 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 | 整数字段 | 
| PositiveSmallIntegerField | IntegerField | 
| SlugField | SlugField | 
| SmallAutoField | 不以形式表示 | 
| TextField | 具有widget = forms.Textarea的CharField | 
| TimeField | TimeField | 
| URLField | URLField | 
注意怪胎!巩固你的基础Python编程基础课程和学习基础知识。
首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。

 
	
