2016-08-22 65 views
0

好奇他們的差異。例如:django形式的meta和property的區別是什麼?

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爲形式的性質,並且它也有在Class Metafields。我想清楚地瞭解他們的區別。提前致謝。

回答

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這是User模型的ModelForm。因此fields屬性指定您希望表單公開的User模型屬性中的哪一個。

  1. 你要字段添加到不在模型的形式:如果

    類本身(emailbirthgender)字段定義只是必要的。在這種情況下,它看起來像genderbirth正是這樣的字段(除非您有一個具有這些字段的自定義用戶模型)。

  2. 您想自定義用於呈現字段的窗口小部件。在這種情況下,您可以覆蓋原始字段並指定一個自定義小部件。這是在birth字段中正在執行的操作,其中窗口小部件具有在默認窗口小部件中不存在的受限日期範圍。

,其他所有字段(usernameemail)將使用默認的小部件,因爲你必須在課堂上沒有明確規定這些被渲染。 password1password2不是User模型屬性,而是在UserCreationForm中定義的附加字段。

相關問題