对他们的不同感到好奇。示例:
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
它将email
,birth
,gender
定义为表单的属性,并且fields
中也有Class Meta
。我想清楚地了解他们的不同之处。提前谢谢。
答案 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']
此属性不用于常规(非模型)表单。
您的问题中的表单子类UserCreationForm
是ModelForm
模型的User
。因此fields
属性指定了您希望表单公开的User
模型属性。
只有在以下情况下,类本身的字段定义(email
,birth
,gender
)才是必需的:
您希望向表单中添加不在模型中的字段。在这种情况下,看起来gender
和birth
就是这样的字段(除非您有自定义用户模型,其中包含这些字段)。
您想要自定义用于渲染字段的窗口小部件。在这种情况下,您可以覆盖原始字段并指定自定义窗口小部件。这是在birth
字段中执行的操作,其中窗口小部件具有默认窗口小部件中不存在的受限日期范围。
所有其他字段(username
,email
)都将使用默认窗口小部件呈现,因为您尚未在类中明确指定它们。 password1
和password2
不是User
模型属性,而是UserCreationForm
中定义的其他字段。