如何在Django模板中显示序列化错误

0 投票
1 回答
67 浏览
提问于 2025-04-14 16:59

我用Django的rest框架创建了一个注册页面,现在我把所有的验证代码都写在了serializers.py里。不过在serializers.py里写了一些错误,但我在模板中看不到这些错误。

serializers.py里,我写了一些验证,比如手机号码、密码和确认密码是否匹配。

class PersonSerializer(serializers.ModelSerializer):
        GENDER_CHOICES = [
            ("male", "Male"),
            ("female", "Female"),
            ("other", "Other"),
        ]
    
        gender = serializers.ChoiceField(choices=GENDER_CHOICES)
        class Meta:
            model = Person
            fields = "__all__"
    
        def create(self, validated_data):
            gender = validated_data.pop("gender")
            validated_data["gender"] = gender.lower()
            return Person.objects.create(**validated_data)
        
        def validate(self, data: Union[str,int]) -> Union[str,int,None]:
            username = data.get("username")
            password = data.get("password")
            confirmpassword=data.get("confirmpassword")
            phone = data.get("phone")
    
            if Person.objects.filter(username=username).exists():
                raise serializers.ValidationError('Username is allready exists')
            if len(phone) != 10:
                raise serializers.ValidationError("phone number is not valid")
            if password != confirmpassword:
                raise serializers.ValidationError('password not match')
            return data

views.py,我也检查了序列化器是否有效。但是之后我不太明白怎么写代码才能在模板中显示错误信息。


class RegisterView(generics.CreateAPIView):
        serializer_class = PersonSerializer
        renderer_classes = [TemplateHTMLRenderer]
        template_name = "register.html"
    
        def get(self, request: Union[Request, HttpRequest]) -> Union[render, redirect]:
            if "username" in request.session:
                return redirect("home")
            serializer = PersonSerializer()
            return render(request, self.template_name, {"serializer": serializer})
    
        def post(self, request: Union[Request, HttpRequest]) -> Union[redirect, render]:
            serializer = PersonSerializer(data=request.data)
            if not serializer.is_valid(raise_exception=True):
                redirect("register")
            return redirect("login")


我希望在模板中显示错误,并且希望能给这些错误加上CSS样式。

1 个回答

0
except ValidationError as e:
    error_message = str(e.detail['non_field_errors'][0])
    return Response({'error': error_message}, status=status.HTTP_400_BAD_REQUEST) 

你好,要从序列化器中获取错误信息,你可以在你的视图里加上“except ValidationError as e”,这样你就可以专门获取错误信息,并把它作为响应返回,这样就能在模板中显示这些信息了。

撰写回答