Пользовательская валидация электронной почты в регистрации Djoser не работает
Я использую Django с Djoser для аутентификации, и мне нужно ограничить регистрацию пользователей только теми электронными адресами, которые указаны в моей таблице kontakte
. Однако моя пользовательская валидация электронной почты, похоже, не вызывается. Вот детали:
Конфигурация джосера:
DJOSER = {
"PASSWORD_RESET_CONFIRM_URL": "auth/password-reset-confirm?uid={uid}&token={token}",
"ACTIVATION_URL": "auth/activation?uid={uid}&token={token}",
"SEND_ACTIVATION_EMAIL": True,
"USER_CREATE_PASSWORD_RETYPE": True,
"PASSWORD_RESET_CONFIRM_RETYPE": True,
"PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND": True,
"TOKEN_MODEL": None,
"FROM_EMAIL": getenv("FROM_EMAIL"),
"SERIALIZERS": {
"user_create": "users.serializers.CustomUserCreateSerializer",
},
}
Пользовательский сериализатор:
from rest_framework import serializers
from djoser.serializers import UserCreateSerializer
from .models import UserAccount, Kontakte
class CustomUserCreateSerializer(UserCreateSerializer):
class Meta(UserCreateSerializer.Meta):
model = UserAccount
fields = ("email", "password", "is_active", "is_staff", "is_superuser")
def validate_email(self, value):
if not Kontakte.objects.filter(email=value).exists():
raise serializers.ValidationError("You are not allowed to register.")
return value
def create(self, validated_data):
user = UserAccount.objects.create_user(
email=validated_data["email"], password=validated_data["password"]
)
return user
Проблема:
- Пользовательская проверка электронной почты в CustomUserCreateSerializer, похоже, не вызывается во время регистрации.
- Мне нужно, чтобы регистрация проверяла таблицу kontakte и отказывала, если email не найден.
То, что я пробовал:
- Убедились, что настройки DJOSER указывают на пользовательский сериализатор.
- Добавил оператор печати в validate_email, чтобы проверить, вызывается ли он (не вызывается).
Любой совет о том, что может быть не так или как обеспечить использование моей пользовательской валидации, будет очень признателен. Спасибо!
Иногда лучший способ проверить достоверность чего-либо - не делать этого вообще; пусть это сделает база данных. Здесь вы можете поступить именно так. Поскольку у вас есть таблица pre-authorized, создайте FK к этой таблице из вашей таблицы UserAccount
; затем перехватите ошибку нарушения FK, когда она возникнет.
К сожалению, я недостаточно хорошо разбираюсь в вашем менеджере обфускации (Django/Djoser), поэтому я приведу сырой sql для выполнения этой задачи: (см. demo здесь)
create table kontakte(valid_email text primary key);
create table registrations(id integer generated always as identity
primary key
,name text
,email text
,constraint valid_user_email
foreign key(email)
references kontakte(valid_email)
);
Спасибо! Я обновил свои файлы в соответствии с вашим предложением, и это сработало.