2012-03-09 4 views
2

Django 1.3/Python 2.7을 사용하고 있습니다.장고 관리에서 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 ** 대신 ** ** ** ** 확장해야합니다. – jpic

+0

@jpic 네, 우선 연장 할 생각입니다. 저것 DRY. 하지만 장고는 끔찍한 문서 (훌륭한 문서이지만 끔찍한 문서)를 가지고 있으며, 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

관련 문제