使用 Django 用户管理使电子邮件字段唯一

发布于 2024-08-22 05:17:37 字数 267 浏览 6 评论 0原文

有一个几乎类似的问题: 如何使 Django 中的 contrib.auth 用户模型中的电子邮件字段唯一

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

There was a nearly similar question: How to make email field unique in model User from contrib.auth in Django

The solution was not perfect: Validating email for uniqueness. The solution provided is rather funny. It disallows modifications to User that leave email intact. How to fix it? Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

溺孤伤于心 2024-08-29 05:17:37

在你的 __init__.py 中

from django.contrib.auth.models import User

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

in your __init__.py

from django.contrib.auth.models import User

User._meta.get_field_by_name('email')[0]._unique = True
万人眼中万个我 2024-08-29 05:17:37

感谢奥弗里·拉维夫,但我所看到的并不是我需要的。所以我解决了自己的问题,现在我想分享一下提示:

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

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

    子类化用户并创建

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

Thanks to Ofri Raviv but what I've seen is not what I needed. So I resolved my own issue and now I'd like to share the tips:

  1. Use username instead of email, exclude email from the form. Mask its label as email.

  2. Subclass User and create a UNIQUE field which receives email addresses, mask it as email, exclude original email field from the form.

It's that simple but took me some time. Hope it help others with the same need.

温馨耳语 2024-08-29 05:17:37

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

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

This method won't make email field unique at the database level, but it's worth trying.

Use a custom 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)

Then in 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])
    #....
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文