【发布时间】:2023-01-19 14:32:52
【问题描述】:
任何人都可以向我解释 Django 的 forms.Form 和 forms.ModelForm 的异同吗?
【问题讨论】:
标签: django django-forms
任何人都可以向我解释 Django 的 forms.Form 和 forms.ModelForm 的异同吗?
【问题讨论】:
标签: django django-forms
从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模型相同的所有字段类型。
【讨论】:
相似之处在于它们都使用小部件生成表单输入集,并且都验证浏览器发送的数据。不同之处在于 ModelForm 从指定的模型类中获取其字段定义,并且还具有处理将基础模型保存到数据库的方法。
【讨论】:
下面是我如何扩展内置的 UserCreationFormmyapp/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')
【讨论】:
区别很简单,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',
]
【讨论】: