有一个几乎相似的问题:How to make email field unique in model User from contrib.auth in Django
解决方案并不完美:验证电子邮件的唯一性。提供的解决方案相当有趣。它不允许修改用户,保持电子邮件不变。怎么解决?提前谢谢!
答案 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,但我所看到的不是我需要的东西。所以我解决了自己的问题,现在我想分享一些提示:
使用用户名而不是电子邮件,从表单中排除电子邮件。将其标签掩盖为电子邮件。
子类用户并创建一个UNIQUE字段,该字段接收电子邮件地址,将其屏蔽为电子邮件,从表单中排除原始电子邮件字段。
就这么简单,但花了我一些时间。希望它能帮助其他有相同需求的人。
答案 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])
#....