ModelForm的表单类可以更改属性吗?

2024-06-07 16:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在StackOverflow中读过一些关于forms.Formvsforms.ModelForm的帖子。在

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

所以我的问题是

  1. 如何排除原始类的一系列属性,下面的排除表达式行吗?在

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

  3. 任何人都可以告诉我表单比简单的HTML有什么好处 表单标记,但它有助于报告

    ^{pr2}$

    我是Django的新学员,如果这些问题看起来很愚蠢,请原谅我,非常感谢您的澄清!


Tags: 代码py模型数据库声明表单date属性
3条回答

“验证”似乎是对3的一个很大的回答——它通常是web框架的一个主要特性。至于不使用HTML标记,这里有一个DRY principle:如果您已经定义了表单的字段是什么(为了验证的目的),为什么要在模板中复制它?有一个关于你的表单是怎样的(在Django中,Form对象,或者{}和{}一起)的单一真实源,并从这个单一的源中派生出你能得到的东西(HTML)。在

正如django文件所述:

If you’re building a database-driven app, chances are you’ll have forms that map closely to Django models. For instance, you might have a BlogComment model, and you want to create a form that lets people submit comments. In this case, it would be redundant to define the field types in your form, because you’ve already defined the fields in your model.

For this reason, Django provides a helper class that let you create a Form class from a Django model.

当您需要与任何已定义模型密切相关的表单时,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表单,您需要实现模板中的表单元素,然后自己验证数据,如下所示。在

^{pr2}$

然后在视图中:

def update_profile(request):
    if request.method == 'POST'
        first_name = request.POST.get('first_name')
        # Do this for all the fields and validate them 
        # manually

使用形式。形式类

使用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

因此,使用ModelForm类,您可以简单地在4-5行代码内创建表单,还可以让django为您进行验证和显示表单错误。在

现在回答你的问题

  1. 有两种方法可以从窗体类中排除特定字段。您可以使用exclude或定义fields。在

排除

from django import forms

class ProfileForm(forms.ModelForm)
    class Meta:
        model = models.Profile
        exclude = ('phone',)

字段

from django import forms

class ProfileForm(forms.ModelForm)
    class Meta:
        model = models.Profile
        fields = ('first_name', 'last_name', 'email', 'profile_summary')
  1. 我真不明白你说的original attributes are not supposed to be changed是什么意思???

  2. 使用ModelForm的好处

    • 更少的代码/无代码重复
    • 表单验证
    • 表单错误
    • 漂亮的代码

1-是的,可以使用

exclude = ['create_date','post_date','is_valid']

关于模型形式的更多信息请点击此处-https://docs.djangoproject.com/en/dev/topics/forms/modelforms/

2-不能更改模型形式的属性是错误的, 您可以通过在类中定义相同的属性来覆盖它 你可以做任何类似于普通形式的操作来覆盖初始、选择等 考试-

^{pr2}$

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

相关问题 更多 >

    热门问题