AttributeError at <URL> During Email Verification Python Django
Я разрабатываю бэкенд своего React-Native приложения на Python Django. Я пытаюсь реализовать регистрацию + верификацию электронной почты.
Сначала пользователь отправляет свою информацию для регистрации в запросе. Поле is_active
по умолчанию имеет значение False. Для каждого пользователя создается verification_token
, хранящийся в отдельной таблице в БД. Пользователь получает письмо, в которое вложена ссылка с созданным verification_token
. Класс VerifyPatient
обрабатывает проверку электронной почты, проверяя, равен ли токен токену в БД.
Я получаю письмо просто отлично, но получаю ошибку AttributeError, когда я нажимаю на ссылку, поэтому пользователь не регистрируется.
Мой файл models.py:
from django.db import models
from django.contrib.auth.models import User
class VerificatonToken(models.Model):
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='token')
verification_token = models.CharField(
max_length=256, blank=True, null=True)
Мой файл serializers.py:
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.validators import UniqueValidator
from rest_framework_jwt.settings import api_settings
from .models import VerificatonToken
class TokenSerializer(serializers.ModelSerializer):
class Meta:
model = VerificatonToken
fields = ('user', 'verification_token',)
class PatientSerializer(serializers.ModelSerializer):
token = serializers.SerializerMethodField()
email = serializers.EmailField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
required=True,
max_length=32,
validators=[UniqueValidator(queryset=User.objects.all())]
)
first_name = serializers.CharField(
required=True,
max_length=32
)
last_name = serializers.CharField(
required=True,
max_length=32
)
# DOB = serializers.DateField(
# required=True
# )
# gender = serializers.CharField(
# required=True
# )
# address = serializers.CharField(
# required=True,
# max_length=60
# )
# contactNo = serializers.IntegerField(
# required=True,
# max_length=11
# )
password = serializers.CharField(
required=True,
min_length=8,
write_only=True
)
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
def get_token(self, obj):
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(obj)
token = jwt_encode_handler(payload)
return token
class Meta:
model = User
fields = (
'token',
'username',
'password',
'first_name',
'last_name',
'email',
'is_active',
# 'DOB',
# 'address',
# 'contactNo',
'id'
)
Мой файл views.py:
Запрос Postman показывает, что информация пользователя успешно сохранена в базе данных:
Нажатие на ссылку направляет меня сюда:
Отслеживание в командной строке:
Как видите:
user = User.objects.filter(id=tokenObj.user.id).first()
Эта конкретная строка в файле views.py под PatientVerificationView
является причиной ошибки, поскольку объект имеет тип None.
Я также заметил, что моя таблица verification_token не хранит созданные verification_token
, как вы можете видеть ниже:
Что именно здесь идет не так?