2012-03-09 2 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) 

Но этот код не работает. Я вижу визуализацию формы, но без поля электронной почты, только поля Username, password1 и password2.

что я здесь не хватает?

+0

Престижность для размещения кода. Примечание: вы должны ** расширить ** UserAdmin, а не ** fork **. – jpic

+0

@jpic да, я думал продлить его первым. это СУХОЙ. но опять же, у Django есть такая ужасная документация (большие tuttorials, но ужасно, как 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

Смежные вопросы