Django表单-模型表单

Django表单-模型表单,django,django-forms,Django,Django Forms,我正在学习Django表格。什么时候应该使用ModelForms而不是Forms?哪个更适合生产 我有点迷路了,那么,为什么我应该使用modelforms而不是仅仅使用表单呢 从概念上讲,ModelForm-派生的表单类旨在尽可能接近地复制底层模型的行为。我在这里使用“行为”的一般含义是:a)模型字段(即数据);和b)模型约束(即,其他一切,可能包括模型字段验证器或自定义业务逻辑或其他任何内容) 从实现的角度来看,ModelForm与Form具有类似的初始基础 然而,与表单不同,模型表单允许紧密

我正在学习Django表格。什么时候应该使用
ModelForms
而不是
Forms
?哪个更适合生产

我有点迷路了,那么,为什么我应该使用modelforms而不是仅仅使用表单呢

从概念上讲,
ModelForm
-派生的表单类旨在尽可能接近地复制底层模型的行为。我在这里使用“行为”的一般含义是:a)模型字段(即数据);和b)模型约束(即,其他一切,可能包括模型字段验证器或自定义业务逻辑或其他任何内容)

从实现的角度来看,
ModelForm
Form
具有类似的初始基础

然而,与
表单
不同,
模型表单
允许紧密的
模型
实例集成

ModelForm
还允许:

  • 表单字段和模型字段之间的一对一字段类型映射。相反,如果使用的是
    表单
    而不是
    模型表单
    ,则需要在
    表单
    类中重新声明任何模型字段。这意味着您将复制应用程序逻辑。要说明这一点,请参见以下内容:
###models.py 从django.db导入模型 教材(models.Model): """ 样本书模型。 """ name=models.CharField(最大长度=100) 作者=模型。ManyToManyField(作者) ###forms.py 来自django导入表单 班级书单(forms.Form): """ 您的`forms.Form`子类松散地表示`Book`模型。 """ name=forms.CharField(最大长度=100) authors=forms.modelmultipechoicefield(queryset=Author.objects.all()) #或者, 类图书格式(forms.ModelForm): """ 您的`forms.ModelForm`子类直接表示`Book`模型。 """ 类元: 模型=书 字段=['name','authors']
  • 要从结果表单中删除的模型字段

  • 同样容易创建

哪一个更适合生产

这两种形式可能适合大多数设置。
ModelForm
Form
都是本地Django web框架组件。您选择使用
ModelForm
还是
Form
取决于特定项目的要求,以及个人偏好和采用的代码惯例

总之,如果可以通过使用
ModelForm
实例轻松表示模型,请使用
ModelForm
。如果没有,请使用自定义的
表单

我有点迷路了,那么,为什么我应该使用modelforms而不是仅仅使用表单呢

从概念上讲,
ModelForm
-派生的表单类旨在尽可能接近地复制底层模型的行为。我在这里使用“行为”的一般含义是:a)模型字段(即数据);和b)模型约束(即,其他一切,可能包括模型字段验证器或自定义业务逻辑或其他任何内容)

从实现的角度来看,
ModelForm
Form
具有类似的初始基础

然而,与
表单
不同,
模型表单
允许紧密的
模型
实例集成

ModelForm
还允许:

  • 表单字段和模型字段之间的一对一字段类型映射。相反,如果使用的是
    表单
    而不是
    模型表单
    ,则需要在
    表单
    类中重新声明任何模型字段。这意味着您将复制应用程序逻辑。要说明这一点,请参见以下内容:
###models.py 从django.db导入模型 教材(models.Model): """ 样本书模型。 """ name=models.CharField(最大长度=100) 作者=模型。ManyToManyField(作者) ###forms.py 来自django导入表单 班级书单(forms.Form): """ 您的`forms.Form`子类松散地表示`Book`模型。 """ name=forms.CharField(最大长度=100) authors=forms.modelmultipechoicefield(queryset=Author.objects.all()) #或者, 类图书格式(forms.ModelForm): """ 您的`forms.ModelForm`子类直接表示`Book`模型。 """ 类元: 模型=书 字段=['name','authors']
  • 要从结果表单中删除的模型字段

  • 同样容易创建

哪一个更适合生产

这两种形式可能适合大多数设置。
ModelForm
Form
都是本地Django web框架组件。您选择使用
ModelForm
还是
Form
取决于特定项目的要求,以及个人偏好和采用的代码惯例


总之,如果可以通过使用
ModelForm
实例轻松表示模型,请使用
ModelForm
。如果没有,请使用自定义的
表单

如果您的应用程序中有一个带有字段标题的示例书模型

models.py

Class Book(models.Model):
  title = models.CharField()
要以一种形式表示它,您有两个选项

forms.py

from myapp.models import Book

class BookSimpleForm(forms.Form):
  title = forms.CharField()

当您使用在简单表单中保存表单的数据时,您必须编写save方法的代码,因为表单未附加到模型。当您使用modelForm时,因为在Meta类中,您特定于告诉窗体何时运行save方法,请将发布的数据保存到modelForm实例的模型中

in views.py

from app.models import Book
from app.forms import BookSimpleForm, BookModelForm
第一选择

 def method(request):
   if request.method == 'POST':
     book = Book(request.POST)
     book.save()
第二种选择

   def method(request):
     if request.method == 'POST':
      form = BookModelForm(request.POST)
      if form.is_valid():
        form.save()
在第一个方法request.Post中,有已发布的数据(标题),因此您可以创建一本书的实例并保存它。ModelForm具有save方法,以便通过
 def method(request):
   if request.method == 'POST':
     book = Book(request.POST)
     book.save()
   def method(request):
     if request.method == 'POST':
      form = BookModelForm(request.POST)
      if form.is_valid():
        form.save()