AttributeError:“str”对象没有属性“ValidationError”Django

2024-10-03 23:24:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建Views.py方法,检查数据库中是否已经存在电子邮件。它适用于用户名,但不适用于电子邮件或令牌。怎样才能做到这一点?谢谢大家!

@api_view(['POST']) def send_user_details(request): if request.method == "POST": serializer = SignUpDetailsForm(data=request.data) if serializer.is_valid(): email = serializer.validated_data['email'] username = serializer.validated_data['username'] password = serializer.validated_data['password'] if User.objects.filter(email=email).exists(): raise email.ValidationError("Este Email ya está en uso") if User.objects.filter(username=username).exists(): raise username.ValidationError("Este Usuario ya está en uso")

这是序列化程序:

class SignUpDetailsForm(serializers.ModelSerializer): class Meta: model = SignUpDetails fields = ( 'first_name', 'last_name', 'email', 'username', 'password', )

它生成AttributeError:“str”对象没有属性“ValidationError”


Tags: dataifobjects电子邮件emailrequestusernamepassword
3条回答

考虑将这些检查迁移到^ {< CD1> }:

from django import forms
from django.core.exceptions import ValidationError

class SignUpDetailForm(forms.Form):
    def clean_email(self):
        email = self.cleaned_data['email']
        
        if User.objects.filter(email=email).exists():
            raise ValidationError('Este Email ya está en uso')
    
    def clean_username(self):
        ...

资料来源:https://docs.djangoproject.com/en/3.2/ref/forms/validation/#cleaning-a-specific-field-attribute

您不能使用raise email.ValidationError(…)email是一个str字符串,字符串没有ValidationError属性。它也是非感官的,因为变量email不包含单词email

您的用户名也没有验证:这是由序列化程序完成的,序列化程序只是在这方面出错,因为User模型的username字段要求username是唯一的。因此,序列化程序将对此进行验证

选项1:由序列化程序进行验证

您还可以为电子邮件实现逻辑。例如,通过定义您自己的模型,或通过向电子邮件序列化字段添加^{} [DRF-doc]

from rest_framework import serializers
from rest_framework.validators import UniqueValidator

class SignUpDetailsForm(serializers.ModelSerializer):

    class Meta:
        model = SignUpDetails
        fields = (
            'first_name',
            'last_name',
            'email',
            'username',
            'password',
        )
        extra_kwargs = {
            'email': {
                'validators': [UniqueValidator(queryset=SignUpDetails.objects.all())]
            }
        }

现在序列化程序将检查电子邮件是否唯一,否则将引发错误。因此,您应该而不是在视图中进行验证,这属于序列化层

选项2:指定电子邮件字段的唯一性

如果定义了自己的用户模型,还可以使电子邮件字段唯一,则用户模型如下所示:

from django.db import models
from django.contrib.auth.models import AbstractUser

class SignUpDetails(AbstractUser):
    email = models.EmailField(
        _('email address')
        unique=True
    )
    # …

你确定它对username有效吗? 好了,我们应该将ValidationError作为异常对象来引发

我们不应该期望表单中的任何值都会引发此异常

from django.core.exceptions import ValidationError

if User.objects.filter(email=email).exists():
    raise ValidationError("Este Email ya está en uso")

相关问题 更多 >