Как ограничить создание учетной записи пользователя Django заданными именами пользователей / адресами / практическими значениями?
Мы настроили создание учетной записи пользователя Django / вход в систему с помощью этого руководства , и мы ограничили контент только для авторизованных пользователей с помощью {% if user.is_authenticated %} и if request.user.is_authenticated. Все работает отлично. Но по-прежнему ничто не мешает любому зайти на сайт и зарегистрировать учетную запись, указав любое значение имени пользователя / адреса электронной почты / пароля.
Мы хотим ограничить создание учетных записей пользователей определенными именами пользователей / электронной почтой / IP-адресами / любым практическим значением. Можем ли мы проверить, находится ли значение в каком-то белом списке, вставив куда-нибудь что-то вроде if email in ['whitelistedemail@example.com']:? Что-то, что посылает по электронной почте пригласительную ссылку?
Мы нашли документацию по разрешениям и авторизации и много вопросов SO по настройке функциональности для типов пользователей, но мы не смогли найти ничего по ограничению создания учетной записи, так что, возможно, мы что-то упускаем.
Мы могли бы начать создавать различные типы пользователей, но мы опасаемся забегать вперед, пытаясь найти более сложное решение до того, как разберемся с этим основным шагом. Правильно ли мы поступаем?
Добрый день, существует множество способов добиться того, о чем вы спрашиваете. Простым приемом может быть использование 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. Существует множество других способов сделать это.