2012-03-09 3 views
2

私はDjango 1.3/Python 2.7を使用しています。Django AdminからUser.emailをユニークに保つ

私のアプリケーションは、ユーザ管理に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) 

しかし、このコードは機能しません。私はフォームのレンダリングを見ることができますが、メールフィールドはなく、Username、password1、password2フィールドだけです。

私はここで何が欠けていますか?

+0

賛辞が欠落しています。注:あなたはおそらく** ** User **を** fork **ではなく拡張するべきです。 – jpic

+0

@jpicはい、私は最初にそれを拡張すると考えました。それはドライです。しかし、やはりDjangoにはこのような恐ろしい文書がありますが、Docsとしては恐ろしいものですが、UserCreationFormのための単一行を入れました。 – pcx

+0

ドキュメントはあまり良くないかもしれませんが、いつでもコード自体を見ることができます。 –

答えて

3

あなたは、コードを投稿して... UserAdmin.add_fieldsets、例えば:

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

私はちょうど同僚の助けを借りてそれを理解し、答えを加えていた。とにかく、お返事いただきありがとうございます。 – pcx