Django Forms - ModelForms

时间:2018-06-14 20:51:43

标签: django django-forms

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

2 个答案:

答案 0 :(得分:3)

  

我有点失落,所以,为什么我应该使用模型而不是仅使用表单

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

从实施的角度来看,ModelFormForm具有相似的初始基础。

但与[{1}}不同,Form允许紧密ModelForm实例集成。

Model也允许:

  • 表单字段与模型字段之间的一对一字段类型映射。相反,如果您使用ModelForm而不是Form,则需要重新声明ModelForm类中的任何模型字段。这意味着您将复制应用程序逻辑。为了说明这一点,请参阅下面的official Django ModelForm docs):
    ### models.py

    from django.db import models


    class Book(models.Model):
        """
        Sample book model.
        """
        name = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)


    ### forms.py

    from django import forms


    class BookForm(forms.Form):
        """
        Your `forms.Form` subclass loosely representing the `Book` model.
        """
        name = forms.CharField(max_length=100)
        authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all())


    # Alternatively,


    class BookForm(forms.ModelForm):
        """
        Your `forms.ModelForm` subclass representing the `Book` model directly.
        """
        class Meta:
            model = Book
            fields = ['name', 'authors']
  

哪一个更适合生产

这两种形式都适合大多数设置。 FormModelForm都是原生的Django Web框架组件。您选择使用Form还是ModelForm取决于具体项目的要求,以及个人偏好和采用的代码约定。

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

答案 1 :(得分:2)

如果您的应用程序中有一个模型,例如Book with a field title

models.py

Class Book(models.Model):
  title = models.CharField()

要以表格形式表示,您有两个选项

forms.py

from myapp.models import Book

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

 class BookModelForm(forms.ModelForm):
     class Meta:
          model = Book
          fields = ('title',)

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

在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有方法保存,以便通过modeform保存方法保存发布的数据并验证它们