【问题标题】:Django's forms.Form vs forms.ModelFormDjango 的 forms.Form 与 forms.ModelForm
【发布时间】:2023-01-19 14:32:52
【问题描述】:

任何人都可以向我解释 Django 的 forms.Formforms.ModelForm 的异同吗?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    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吗?当您通过 request.POST 初始化它时,可以在普通视图中呈现和处理表单。
    • 是的。这是他们的预期用途。管理表单是一个完全不同的野兽,不在这个问题的范围之内。习惯参考官方文档。它非常棒,几乎每次都能为您省钱。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      下面是我如何扩展内置的 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')
      

      【讨论】:

        【解决方案4】:

        区别很简单,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',
                    
                ]
        

        【讨论】:

          猜你喜欢
          • 2017-01-12
          • 2021-01-10
          • 2011-08-02
          • 2015-02-05
          • 1970-01-01
          • 1970-01-01
          • 2019-08-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多