我正在学习Django表格。我应该何时使用ModelForms
而不是Forms
?哪种更适合生产?
答案 0 :(得分:3)
我有点失落,所以,为什么我应该使用模型而不是仅使用表单
从概念上讲,ModelForm
- 派生的表单类旨在尽可能地复制底层模型的行为。我在一般意义上使用“行为”来表示:a)模型字段(即数据); b)模型约束(即其他一切,可能包括模型字段验证器或自定义业务逻辑或其他任何东西)。
从实施的角度来看,ModelForm
与Form
具有相似的初始基础。
但与[{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']
从结果表单中将模型字段设为included or explicitly excluded
model formsets即可轻松创建。
哪一个更适合生产
这两种形式都适合大多数设置。 Form
和ModelForm
都是原生的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保存方法保存发布的数据并验证它们