сохраняя User.email уникальным от Django Admin - PullRequest
2 голосов
/ 09 марта 2012

Я использую Django 1.3 / Python 2.7.

Мое приложение использует 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'^[\w.@+-]+$',
        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.

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

1 Ответ

3 голосов
/ 09 марта 2012

Вам не хватает ... UserAdmin.add_fieldsets, например ::

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