使用Django用户管理员使电子邮件字段独一无二

时间:2010-02-17 06:56:05

标签: django django-admin django-forms

有一个几乎相似的问题:How to make email field unique in model User from contrib.auth in Django

解决方案并不完美:验证电子邮件的唯一性。提供的解决方案相当有趣。它不允许修改用户,保持电子邮件不变。怎么解决?提前谢谢!

3 个答案:

答案 0 :(得分:17)

__init__.py

from django.contrib.auth.models import User

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

答案 1 :(得分:2)

感谢Ofri Raviv,但我所看到的不是我需要的东西。所以我解决了自己的问题,现在我想分享一些提示:

  1. 使用用户名而不是电子邮件,从表单中排除电子邮件。将其标签掩盖为电子邮件。

  2. 子类用户并创建一个UNIQUE字段,该字段接收电子邮件地址,将其屏蔽为电子邮件,从表单中排除原始电子邮件字段。

  3. 就这么简单,但花了我一些时间。希望它能帮助其他有相同需求的人。

答案 2 :(得分: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])
    #....