Python ModelForm的form类可以更改属性吗?

Python ModelForm的form类可以更改属性吗?,python,django,forms,Python,Django,Forms,我在StackOverflow上读过一些关于forms.Formvsforms.ModelForm的帖子 当数据库中已经有表单的表时,最好使用ModelForm,这样就不必再次声明所有属性,因为它们已经存在于model.py中的相应类中 所以我的问题是 如何排除原始类的一系列属性,下面的排除表达式是否正确 class CreatePositionForm(ModelForm): class Meta: model = job_position e

我在StackOverflow上读过一些关于
forms.Form
vs
forms.ModelForm
的帖子

当数据库中已经有表单的表时,最好使用
ModelForm
,这样就不必再次声明所有属性,因为它们已经存在于model.py中的相应类中

所以我的问题是

  • 如何排除原始类的一系列属性,下面的排除表达式是否正确

    class CreatePositionForm(ModelForm):  
        class Meta:  
            model = job_position 
            exclude = ('create_date','post_date','is_valid',)
    
  • 当使用ModelForm时,是否意味着原始属性不应该更改,并且在类Meta之前不会有更多的代码?(就像上面的代码一样)

  • 任何人都可以告诉我,使用表单而不是简单的HTML有什么好处 表单标记,但它有助于报告中的错误

    form.field_name.errors
    
    我是Django的新学员,如果这些问题看起来很愚蠢,请容忍,非常感谢您的澄清


  • 您可以使用ModelForm并更改原始属性,但在大多数情况下,Django做得很好

    Django表单非常有用,您可以执行高级验证,添加一些业务逻辑。django表单呈现HTML,但即使您的django项目不提供HTML,您可能仍在使用django表单

    您的排除代码似乎没有问题,但请注意,使用
    Meta.excludes
    被认为是一种安全风险。使用
    Meta.fields

  • (尽管您也可以使用元组,只需引用文档,请参见注释)。你应该把它改成-

    exclude = ['create_date','post_date','is_valid']
    
  • 不是那样的。你可以改变任何你想要的。您可以添加自定义小部件,更改表单字段属性,甚至向其添加更多表单字段
    ModelForm
    只会使模型和表单更加耦合,以便正确地进行验证。如果使用
    表单
    代替模型中的相同字段,则必须重新定义字段类型

  • 使用
    表单
    可以减少管理字段属性的麻烦。若您更改了模型中的某些内容,这些更改将自动反映到表单的HTML中。您不必每次都手动更改HTML。它还可以帮助您进行自动验证


  • “验证”似乎是3的一个重要答案——它通常是web框架的一个主要特性。至于不使用HTML标记,有一个问题:如果您已经定义了表单的字段是什么(出于验证目的),为什么要在模板中复制它?有一个关于表单外观的真实来源(在Django中,是
    表单
    对象,或
    模型表单
    s与
    模型
    s),并从该单一来源派生出您可以使用的内容(HTML)。

    1-是的,可以使用

    exclude = ['create_date','post_date','is_valid']
    
    更多关于模型形式的信息,请点击此处-

    2-不能更改模型窗体的属性是错误的, 您可以通过在类中定义相同的属性来克服它 你可以做任何事情,比如用普通形式来覆盖初始值,选择等等 exa-

    3-最有价值的好处是,它能够自行进行表单验证,无论您是否编写自己的html,都必须编写一长行代码。 例如,您已经给出了一个char字段,它将抛出一个错误,并将error类添加到html的field属性中,这是一个很大的优点。
    因此,在开发检查功能性的同时,它减少了编写html的开销。

    表单和模型表单都扩展了相同的类:

    class BaseModelForm(BaseForm)
    class Form(BaseForm)
    
    因此:

  • 这样排除是可以的,但问题是在保存时:如果代码中排除的字段是必需的或没有默认值,则必须处理这些字段

  • 可以向ModelForm对象添加额外属性:

    类CreatePositionForm(ModelForm):
    新字段=forms.CharField(最大长度=100) 类元:
    模型=工作职位 排除=('create_date'、'post_date'、'is_valid'、) 但是,您必须将它们包括在字段列表中(如果要渲染它们):

    。。。。 类元: .... 字段=[…,“新字段”,…]

    当你存钱的时候,你需要注意这个字段

  • 表单具有基于您使用的FormField和小部件类型的默认验证。ModelForms还具有基于模型字段的验证、每个字段/每个表单的错误报告、直接保存到db的功能。除此之外,我发现在使用表单集(每页有多个表单)时,使用modelforms更容易

  • 正如django文件所述:

    如果您正在构建一个数据库驱动的应用程序,那么很可能会有与Django模型非常接近的表单。例如,您可能有一个BlogComment模型,并且您希望创建一个允许人们提交评论的表单。在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段

    因此,Django提供了一个帮助器类,允许您从Django模型创建表单类

    当您需要与任何已定义模型密切相关的表单时,ModelForm非常有用。ModelForm相对于
    form.form
    类的优点是不需要编写额外的代码。例如:假设您有一个定义如下的模型:

    class Profile(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        email = models.EmailField()
        phone = models.IntegerField()
        profile_summary = models.TextField()
        # .. some more fields ..
    
    现在,让我们使用3种不同的方法创建一个表单,看看哪种方法最容易实现

    简单HTML表单

    对于普通HTML表单,您需要在模板中实现表单元素,然后自己验证数据,如下所示

    <form id="profile-form">
        <div>
            <label>First Name</label>
            <input name="first_name" type="text" />
        </div>
        <div>
            <label>Last Name</label>
            <input name="last_name" type="text" />
        </div>
        <div>
            <label>Email</label>
            <input name="email" type="text" />
        </div>
        <div>
            <label>Phone Number</label>
            <input name="phone" type="text" />
        </div>
        <div>
            <label>Profile Summary</label>
            <textarea name="profile_summary"></textarea>
        </div>
    </form>
    
    使用表单。表单类

    from django import forms
    
    class ProfileForm(forms.ModelForm)
        class Meta:
            model = models.Profile
    
    from django import forms
    
    class ProfileForm(forms.ModelForm)
        class Meta:
            model = models.Profile
            fields = ('first_name', 'last_name', 'email', 'profile_summary')
    
    使用
    django.forms.Form
    类,可以如下定义表单

    from django import forms
    
    class ProfileForm(forms.Form):
        first_name = forms.CharField()
        last_name = forms.CharField()
        email = forms.EmailField()
        phone = forms.IntegerField()
        summary = forms.TextField()
        # Notice the code duplication here
        # we already have this defined in our models.
    
    使用ModelForm类

    from django import forms
    
    class ProfileForm(forms.ModelForm)
        class Meta:
            model = models.Profile
    
    from django import forms
    
    class ProfileForm(forms.ModelForm)
        class Meta:
            model = models.Profile
            fields = ('first_name', 'last_name', 'email', 'profile_summary')
    
    因此,使用
    ModelForm
    类,您只需在4-5行代码内创建表单,还可以让django为您进行验证并显示表单错误

    现在回答大家的问题,

  • Ther
    from django import forms
    
    class ProfileForm(forms.ModelForm)
        class Meta:
            model = models.Profile
            fields = ('first_name', 'last_name', 'email', 'profile_summary')