Django的形式.Form vs forms.ModelForm

时间:2010-02-20 18:58:31

标签: django django-forms

任何人都可以向我解释Django forms.Form&的相似点和不同点。 forms.ModelForm

4 个答案:

答案 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',
            
        ]