2010-02-17 2 views
7

Там было почти аналогичный вопрос: How to make email field unique in model User from contrib.auth in DjangoСоздания поле электронной почты с уникальным Джанго пользователя администратором

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

+0

, какие из предлагаемых решений вы говорите? принятое решение? –

+0

Да. Принято. – Viet

+0

Я ответил в другом вопросе. Я думаю, что этот должен быть закрыт, поскольку он является полным дубликатом. –

ответ

2

Благодаря Офри Равиву, но то, что я видел, не то, что мне нужно. Поэтому я решил свой собственный вопрос, и теперь я хотел бы поделиться советами:

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

  2. Подкласс Пользователь и создайте поле UNIQUE, которое получает адреса электронной почты, маскирует его как электронную почту, исключает исходное поле электронной почты из формы.

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

17

в вашем __init__.py

from django.contrib.auth.models import User 

User._meta.get_field_by_name('email')[0]._unique = True 
+0

+1 спасибо. Я попробую его. – Viet

+1

Обезьяна-путь плохой, но contib.auth настолько плохо спроектирован, что использование обезьян-патчей здесь не должно быть позором вообще. – DataGreed

+0

Прошу пояснить про init.py, пожалуйста. В моем проекте есть десятки __init__.py. Какой из них ты имеешь в виду? Hmm .. stackoverflow не показывает подчеркивания, это смущает ... –

0

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

Использование пользовательских validator:

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]) 
    #.... 
+0

Это решение немного ошибочно в том, что UserForm можно использовать только для создания пользователей. Если вы использовали его для редактирования пользователя, «существует» было бы правдой, хотя это ожидаемый результат. –

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