Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

348
Vistas
AttributeError: el objeto 'str' no tiene atributo 'ValidationError' Django

Estoy tratando de crear el método Views.py donde verifico si el correo electrónico ya existe en la base de datos. Funcionó para el nombre de usuario pero no funciona para correos electrónicos o tokens. ¿Cuál sería la forma de hacerlo posible? ¡Gracias!

 @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")

Este es el serializador:

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

Genera AttributeError: el objeto 'str' no tiene atributo 'ValidationError'

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

No se puede utilizar raise email. ValidationError(…) . email es una str y una cadena no tiene el atributo ValidationError . Tampoco tiene sentido, ya que la variable email no contiene la palabra email.

Su nombre de usuario tampoco se valida: eso lo hace el serializador, y el serializador simplemente falla en esto porque el campo de nombre de username del modelo de User requiere que el nombre de username sea único. Por lo tanto, el serializador validará esto.

Opción 1: validando por el serializador

También puede implementar la lógica para el correo electrónico. Por ejemplo, definiendo su propio modelo o agregando un UniqueValidator [DRF-doc] al campo de serialización del correo electrónico:

 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()) ] } }

Ahora, el serializador verificará si el correo electrónico es único y, de lo contrario, generará un error. Por lo tanto, no debe realizar la validación en la vista, esto pertenece a la capa de serialización.

Opción 2: especificar la unicidad de un campo de correo electrónico

Si definió su propio modelo de usuario, también puede hacer que el campo de correo electrónico sea único, luego el modelo de usuario se ve así:

 from django.db import models from django.contrib.auth.models import AbstractUser class SignUpDetails(AbstractUser): email = models.EmailField( _('email address') unique=True ) # …
about 4 years ago · Juan Pablo Isaza Denunciar

0

Considere migrar estos controles a SignUpDetailForm :

 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): ...

Fuente: https://docs.djangoproject.com/en/3.2/ref/forms/validation/#cleaning-a-specific-field-attribute

about 4 years ago · Juan Pablo Isaza Denunciar

0


¿Estás seguro de que funciona para el nombre de username ? AFAIK, deberíamos generar ValidationError solo como un objeto de excepción.

No debemos esperar que ninguno de los valores de form genere esta excepción.

 from django.core.exceptions import ValidationError if User.objects.filter(email=email).exists(): raise ValidationError("Este Email ya está en uso")
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda