【问题标题】:Making email field unique with Django User admin使用 Django 用户管理员使电子邮件字段唯一
【发布时间】:2011-01-17 17:49:28
【问题描述】:

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

解决方案并不完美:验证电子邮件的唯一性。提供的解决方案相当有趣。它不允许对用户进行修改而使电子邮件保持不变。如何解决?提前致谢!

【问题讨论】:

  • 您在谈论哪些建议的解决方案?接受的解决方案?
  • 我在另一个问题中回答了。我认为这个应该关闭,因为它是完全重复的。
  • 哪一个?你确定这个问题和你的答案符合我的要求吗?谢谢。
  • 我编辑了stackoverflow.com/questions/1160030/…,我认为它现在符合您的要求。
  • +1 谢谢!你赢得了我的两次投票=)也许我需要一本关于 Django 的书。我错过了一些小细节。

标签: django django-admin django-forms


【解决方案1】:

在你的__init__.py

from django.contrib.auth.models import User

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

【讨论】:

  • monkey-pathcing 很糟糕,但是 contib.auth 的设计非常糟糕,在这里使用猴子补丁应该一点也不丢人。
  • 请对 init.py 进行澄清。我的项目中有几十个 init.py。你说的是哪一个?嗯..stackoverflow 不显示下划线,这让人困惑...
  • 实际上每个 init.py 都可以。但我会推荐位于根目录中的那个。
  • +1 谢谢,但是在 init.py 中我遇到了这个错误:AppRegistryNotReady("Models aren't loaded yet.") ...我试图在 wsgi.py 中添加这段代码,现在它可以工作了。 Django==1.7.1 :)
  • 谢谢,但我遇到了这个错误:AttributeError: 'Options' object has no attribute 'get_field_by_name' ...我将第二行更改为User._meta.get_field("email")._unique = True,现在它可以工作了。 Django==1.10.4
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    此方法不会使电子邮件字段在数据库级别具有唯一性,但值得尝试。

    使用自定义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])
        #....
    

    【讨论】:

    • 这个方案有点缺陷,UserForm只能用来创建用户。如果您使用它来编辑用户,“存在”将是真实的,即使这是预期的结果。
    猜你喜欢
    • 2019-04-26
    • 2017-06-17
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多