我在StackOverflow上读过一些关于forms.Formvsforms.ModelForm的文章。
当表格中已经有一个表时,最好使用ModelForm,这样您就不必再次声明所有属性,因为它们已经存在于Mult.Py中相应的类中。
所以我的问题是
如何排除原始类的一系列属性,下面的排除表达式行吗?

class CreatePositionForm(ModelForm):
    class Meta:
        model = job_position
        exclude = ('create_date','post_date','is_valid',)

当使用ModelForm时,是否意味着原始属性不应该更改,并且在类Meta之前不会有更多的代码?(就像上面的代码一样)
任何人都可以告诉我拥有一个表单比简单的HTML有什么好处
表单标记,但它有助于在
form.field_name.errors

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

最佳答案

正如django docs所说:
如果您正在构建一个数据库驱动的应用程序,那么很可能会有与Django模型非常接近的表单。例如,您可能有一个blogcoment模型,并且希望创建一个允许人们提交评论的表单。在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段。
因此,Django提供了一个helper类,允许您从Django模型创建一个表单类。
当您需要与任何已定义模型密切相关的窗体时,ModelForm非常有用。与form.Form类相比,ModelForm的优点是不需要编写额外的代码。例如:假设您的模型定义如下:

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>

然后在视图中:
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进行验证和显示表单错误。
现在回答你的问题,
有两种方法可以从窗体类中排除特定字段。您可以使用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')

我真的不明白你说的“抄送”是什么意思???
使用ModelForm的好处
更少的代码/无代码重复
表单验证
表格错误

漂亮的代码

10-05 20:25
查看更多