Создание поля электронной почты уникальным с помощью администратора Django - PullRequest
7 голосов
/ 17 февраля 2010

Возник почти похожий вопрос: Как сделать поле электронной почты уникальным в модели. Пользователь из contrib.auth в Django

Решение не было идеальным: проверка электронной почты на уникальность. Предоставленное решение довольно забавно. Он запрещает модификации Пользователя, которые не затрагивают электронную почту. Как это исправить? Заранее спасибо!

Ответы [ 3 ]

17 голосов
/ 22 июня 2010

в вашем __init__.py

from django.contrib.auth.models import User

User._meta.get_field_by_name('email')[0]._unique = True
2 голосов
/ 18 февраля 2010

Спасибо Офри Равиву, но то, что я видел, не то, что мне было нужно. Итак, я решил свою собственную проблему, и теперь я хотел бы поделиться советами:

  1. Используйте имя пользователя вместо электронной почты, исключите электронную почту из формы. Маскируйте его метку как электронную почту.

  2. Пользователь подкласса и создайте УНИКАЛЬНОЕ поле, которое получает адреса электронной почты, маскирует его как электронную почту, исключает оригинальное поле электронной почты из формы.

Это так просто, но заняло у меня некоторое время. Надеюсь, что это поможет другим с такой же нуждой.

0 голосов
/ 06 декабря 2011

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

Использовать пользовательский валидатор :

from django.core.exceptions import ValidationError
from django.contrib.auth.models import User

def validate_email_unique(value):
    exists = User.objects.filter(username=value)
    if exists:
        raise ValidationError("Email address %s already exits, must be unique" % value)

Тогда в forms.py:

from django.contrib.auth.models import User
from django.forms import ModelForm
from main.validators import validate_email_unique


class UserForm(ModelForm):
    #....
    email = forms.CharField(required=True, validators=[validate_email_unique])
    #....
...