任何人都可以向我解释Django forms.Form
&的相似点和不同点。 forms.ModelForm
?
答案 0 :(得分:95)
由forms.Form
创建的表单由您手动配置。对于不直接与模型交互的表单,最好使用它们。例如,联系表单或简报订阅表单,您可能不一定与数据库进行交互。
从forms.ModelForm
创建的表单将自动创建,然后由您调整。最好的例子来自Django网站上提供的精湛文档。
<强> forms.Form
强>
文档:Form objects
使用forms.Form
创建的普通表单示例:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
<强> forms.ModelForm
强>
文档:Creating forms from models
直接来自文档:
如果你的表格将被用来 直接添加或编辑Django模型, 您可以使用
ModelForm
来避免 复制您的模型描述。
使用forms.Modelform
创建的模型表单示例:
from django.forms import ModelForm
from . import models
# Create the form class.
class ArticleForm(ModelForm):
class Meta:
model = models.Article
此表单自动具有与其创建的Article
模型相同的字段类型。
答案 1 :(得分:12)
相似之处在于它们都使用小部件生成表单输入集,并且都验证浏览器发送的数据。不同之处在于ModelForm从指定的模型类中获取其字段定义,并且还具有处理将基础模型保存到数据库的方法。
答案 2 :(得分:6)
以下是我如何扩展内置UserCreationForm myapp / forms.py :
from django import forms
from django.contrib.auth.forms import UserCreationForm
class RegisterForm(UserCreationForm):
first_name = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30)
email = forms.CharField(max_length=75)
class Meta(UserCreationForm.Meta):
fields = ('username','first_name','last_name', 'email')
答案 3 :(得分:1)
区别很简单,ModelForm 用于创建模型的表单。 这意味着 Model 旨在为您的表格创建某种架构,您将在其中保存表单提交中的数据,并且 ModelForm 只是创建模型的表单(根据表格的架构)
# This creates a form from model Article
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['pub_date', 'headline', 'content', 'reporter']
表单是一种与您的数据库(模型)无关的常见表单。
# A simple form to display Subject and Message field
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
换句话说, 如果您的应用程序中有一个模型,并且您想创建一个表单来在该模型中输入数据(并通过它输入数据库),请使用 forms.ModelForm
如果您只是想使用 django 创建表单,请使用 form.Form
但你也可以一起使用:
from django import forms
# A simple form to display Subject and Message field
class ContactForm(forms.ModelForm):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
class Meta:
model = Contact #when you have this model
fields = [
'subject',
'message',
]