django形式的meta属性和字段之间的区别是什么?

时间:2016-08-22 03:28:12

标签: django django-forms

对他们的不同感到好奇。示例:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

GENDER_CHOICES = (
    ('M', '남'),
    ('F', '여'),
)


class MyUserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)
    birth = forms.DateField(widget=forms.SelectDateWidget(
        years=range(1970, 2015)), required=True)
    gender = forms.ChoiceField(choices=GENDER_CHOICES, initial='M')

    class Meta:
        model = User
        fields = ('username', 'birth', 'email',
                  'gender', 'password1', 'password2')

    def save(self, commit=True):
        user = super(MyUserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.birthday = self.cleaned_data['birth']

        if commit:
            user.save()

        return user

它将emailbirthgender定义为表单的属性,并且fields中也有Class Meta。我想清楚地了解他们的不同之处。提前谢谢。

1 个答案:

答案 0 :(得分:0)

Meta.fields属性适用于model forms。它用于指定希望模型表单处理的模型字段。所以如果你有这样的模型:

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    date = models.DateField(auto_now=True)

您可以定义仅处理name的表单,因为date是自动填充的,您可能不希望用户能够手动设置它:

class MyModelForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = ['name']

此属性不用于常规(非模型)表单。

您的问题中的表单子类UserCreationFormModelForm模型的User。因此fields属性指定了您希望表单公开的User模型属性。

只有在以下情况下,类本身的字段定义(emailbirthgender)才是必需的:

  1. 您希望向表单中添加不在模型中的字段。在这种情况下,看起来genderbirth就是这样的字段(除非您有自定义用户模型,其中包含这些字段)。

  2. 您想要自定义用于渲染字段的窗口小部件。在这种情况下,您可以覆盖原始字段并指定自定义窗口小部件。这是在birth字段中执行的操作,其中窗口小部件具有默认窗口小部件中不存在的受限日期范围。

  3. 所有其他字段(usernameemail)都将使用默认窗口小部件呈现,因为您尚未在类中明确指定它们。 password1password2不是User模型属性,而是UserCreationForm中定义的其他字段。