Django auth.user с уникальным адресом электронной почты - PullRequest
6 голосов
/ 25 апреля 2011

Я использую систему django.auth, и у меня есть это:

class RegisterForm(UserCreationForm):
    username = forms.RegexField(label= "Username" , max_length = 30, regex = r'^[\w]+$', error_messages = {'invalid': "This value may contain only letters, numbers and _ characters."})
    email = forms.EmailField(label = "Email")
    first_name = forms.CharField(label = "First name", required = False)
    last_name = forms.CharField(label = "Last name", required = False)

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

    def save(self, commit = True):
        user = super(RegisterForm, self).save(commit = False)
        user.first_name = self.cleaned_data["first_name"]
        user.last_name = self.cleaned_data["last_name"]
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user

Я хочу настроить электронные письма как уникальные и проверить форму для этой проверки.Как я могу это сделать?

Ответы [ 5 ]

16 голосов
/ 03 октября 2012

Где-то в ваших моделях:

from django.contrib.auth.models import User
User._meta.get_field('email')._unique = True

Обратите внимание на подчеркивание перед unique.Это где информация на самом деле хранится.User._meta.get_field('email').unique - это просто @property, который изучает его.

Это должно работать и для syncdb, так что вы будете согласованы с базой данных.

Обратите внимание, что из Django 1.5 выне нужно будет делать такие вещи, так как модель пользователя будет подключаемой.

9 голосов
/ 25 апреля 2011

добавьте это к вашей форме. Но это не идеальный способ. Условия гонки доступны только при использовании этой формы. Я рекомендую вам добавить уникальное ограничение на уровне БД.

def clean_email(self):
    data = self.cleaned_data['email']
    if User.objects.filter(email=data).exists():
        raise forms.ValidationError("This email already used")
    return data

SQL для добавления уникального ограничения:

ALTER TABLE auth_user ADD UNIQUE (email)
1 голос
/ 05 июля 2011

Я не уверен, как это использовать, но

from django.contrib.auth.models import User
User._meta.get_field_by_name('email')[0].unique=True

должен это сделать. Я полагаю, что это происходит в вашем models.py перед тем, как вы запустите syncdb для аутентификационной модели. Бут, чтобы попробовать это сам.

0 голосов
/ 31 декабря 2017

Вы можете сделать то же самое, используя это в Абстрактной пользовательской модели:

class User(AbstractUser):
...

class Meta:
    unique_together = ('email',)
0 голосов
/ 25 апреля 2011

Переопределение метода clean (), предложенного mumimo, описано здесь: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method

Обычно вы можете использовать unique = True в определении поля, а затем использовать ModelForm, чтобы он автоматически запускался clean() для всех полей в вашей форме, но если вы используете пользовательский класс django.auth, вы не можете изменять поля.

...