如何将 Django 用户帐户创建限制为给定的用户名/地址/实用值?

How to restrict Django user account creation to given usernames / addresses / practical values?

我们已经通过 this tutorial 设置了 Django 用户帐户创建/登录,并且我们已经通过 {% if user.is_authenticated %}if request.user.is_authenticated 之类的方式将内容限制为授权用户.一切都很好。但是仍然没有什么可以阻止任何人访问该网站并注册一个提供用户名/电子邮件地址/密码任何值的帐户。

我们希望将用户帐户创建限制为特定的用户名/电子邮件/IP/任何实用值。我们可以通过在某处插入类似 if email in ['whitelistedemail@example.com']: 的内容来检查某个值是否在某个白名单中吗?通过电子邮件发送邀请的东西 link?

我们发现 the docs on Permissions and Authorization 和许多关于为用户类型自定义功能的问题,但我们找不到任何关于限制帐户创建本身的问题,所以我们可能遗漏了一些东西。

我们可以开始创建不同类型的用户,但我们小心谨慎,以免在弄清楚这个基本步骤之前尝试更高级的解决方案。我们以正确的方式处理这个问题吗?

美好的一天,有很多方法可以实现您的要求。一个简单的技巧可能是使用 validators.

由于您遵循的教程没有深入细节,您将不得不执行额外的步骤。

我不知道你的项目结构,所以我假设你了解 django 的基础知识。

创建自定义验证器

在名为 validators.py 的文件中添加以下内容 (c.f django EmailValidator) :

from django.core.validators import EmailValidator
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

EMAIL_LIST = []

validate_email = EmailValidator(allowlist=EMAIL_PATTERN)

根据需要更改EMAIL_PATTERN。

创建自定义表单

在名为 forms.py 的文件中添加如下内容:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _

from validators import validate_email


class CustomUserCreationForm(UserCreationForm):

    email = forms.EmailField(label=_("Email"), validators=[validate_email])

    class Meta:
        model = User
        fields = [
            "username",
            "email",
            "password1",
            "password2",
        ]

创建自定义注册视图

在你的views.py

from django.urls import reverse_lazy
from django.views.generic import CreateView
from forms import CustomUserCreationForm

class SignupView(CreateView):
    form_class = CustomUserCreationForm
    template_name = "the-place-of-your/registration-template.html"
    success_url = reverse_lazy("you-custom-success-url-name")

您必须创建自定义模板。

编辑您的网址

urlpatterns = [
    ...
    path("", include("django.contrib.auth.urls")),
    path("signup/", SignupView.as_view(), name="signup"),
    ...
]

我的适度演示是一种使用 allowlist arg 实现对电子邮件验证的限制的方法。还有许多其他方法。