2012-03-09 61 views
2

我使用Django 1.3/Python 2.7。保持User.email獨一無二Django Admin

我的應用程序使用django.contrib.auth進行用戶管理。對於主用戶註冊,我有一個表格來檢查「電子郵件」是否已經註冊。所以它確保所有電子郵件字段都是唯一的。

但它發生了一些管理員使用django管理界面添加用戶,並最終使用相同的電子郵件添加重複的帳戶。

爲此,我創建了一個NewUserCreationForm,其中我複製了django.contrib.auth.UserCreationForm併爲其添加了一個'email'字段。

class NewUserCreationForm(forms.ModelForm): 
    """                                                    
    A form that creates a user, with no privileges, from the given username and password.                               
    """ 
    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\[email protected]+-]+$', 
     help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."), 
     error_messages = {'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")}) 
    password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) 
    password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput, 
     help_text = _("Enter the same password as above, for verification.")) 
    email = forms.EmailField(label=_("Email"), max_length=75) 

    class Meta: 
     model = User 
     fields = ("username", "email") 

    def clean_username(self): 
     username = self.cleaned_data["username"] 
     try: 
      User.objects.get(username=username) 
     except User.DoesNotExist: 
      return username 
     raise forms.ValidationError(_("A user with that username already exists.")) 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1", "") 
     password2 = self.cleaned_data["password2"] 
     if password1 != password2: 
      raise forms.ValidationError(_("The two password fields didn't match.")) 
     return password2 

    def save(self, commit=True): 
     user = super(NewUserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     user.email = self.email 
     if commit: 
      user.save() 
     return user 


class CustomUserAdmin(UserAdmin): 
    add_form = NewUserCreationForm 


admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 

但這種代碼是行不通的。我可以看到表單呈現,但沒有電子郵件字段,只有用戶名,密碼1和密碼2字段。

這是什麼,我在這裏失蹤?

+0

榮譽張貼的代碼。注意:你應該**擴展** UserAdmin而不是** fork **它。 – jpic 2012-03-09 11:33:29

+0

@jpic是的,我想先擴展它。這是乾的。但是Django又一次出現了這樣可怕的文檔(很棒的文檔,但是文檔很糟糕),它們只是爲UserCreationForm放置了一行代碼。 – pcx 2012-03-09 11:37:30

+0

文檔可能不是很好,但您始終可以查看代碼本身。 – 2012-03-09 12:28:14

回答

3

你缺少... UserAdmin.add_fieldsets,例如:

class CustomUserAdmin(UserAdmin): 
    add_form = NewUserCreationForm 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('username', 'password1', 'password2', 'email')} 
     ), 
    ) 
+0

我剛剛在一位同事的幫助下找到了答案,並加入了答案。無論如何,謝謝你的回答。 – pcx 2012-03-09 11:35:09