Django的形式.Form vs forms.ModelForm

Vie*_*iet 70 django django-forms

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

jat*_*ism 102

创建的表单forms.Form由您手动配置.对于不直接与模型交互的表单,最好使用它们.例如,联系表单或简报订阅表单,您可能不一定与数据库交互.

创建的表单forms.ModelForm将自动创建,然后由您调整.最好的例子来自Django网站上提供的精湛文档.

forms.Form:
文档:表单对象
使用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)
Run Code Online (Sandbox Code Playgroud)

forms.ModelForm:
文档:从模型创建表单
直接从文档:

如果您的表单将用于直接添加或编辑Django模型,则可以使用a ModelForm来避免重复模型描述.

使用forms.Modelform以下方法创建的模型表单示例:

from django.forms import ModelForm
from . import models

# Create the form class.
class ArticleForm(ModelForm):
    class Meta:
        model = models.Article
Run Code Online (Sandbox Code Playgroud)

此表单自动具有与Article创建模型相同的所有字段类型.

  • 是的。这就是他们的预期用途。管理表单是一个完全不同的野兽,超出了这个问题的范围。习惯参考官方文档。它太棒了,几乎每次都会拯救你。 (2认同)

Ign*_*ams 13

相似之处在于它们都使用小部件生成表单输入集,并且都验证浏览器发送的数据.不同之处在于ModelForm从指定的模型类获取其字段定义,并且还具有处理将基础模型保存到数据库的方法.


Ste*_*hry 7

这是我如何扩展内置的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')
Run Code Online (Sandbox Code Playgroud)


Sid*_*qui 5

区别很简单,ModelForm 用于创建 Model 的形式。这意味着 Model 旨在创建表的某种模式,您将在其中保存表单提交中的数据,而ModelForm只是创建模型的表单(根据表的模式)

# This creates a form from model Article

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['pub_date', 'headline', 'content', 'reporter']
Run Code Online (Sandbox Code Playgroud)

Form 是一个普通的表单,与你的数据库(model)无关。

# 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)
Run Code Online (Sandbox Code Playgroud)

换句话说,如果您的应用程序中有一个模型,并且您想创建一个表单来在该模型中输入数据(并通过它到数据库),请使用 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',
            
        ]
Run Code Online (Sandbox Code Playgroud)