You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目视图AssertionError问题及过往password2 TypeError求助

问题解决步骤

1. 修复 AssertionError 错误

DRF 视图必须返回Response(或 Django 原生的 HttpResponse 类),你的代码存在两个核心问题:

  • 直接返回serializer.data字典,而非 DRF 封装的Response对象
  • 当serializer.is_valid()验证不通过,或请求方法不符合要求时,视图无返回值,最终返回None

修改后的视图代码:

from rest_framework.decorators import api_view
from rest_framework.response import Response  # 导入Response类
from user_app.api.serializers import RegistrationSerializer

@api_view(['POST',])
def registration_view(request):
    if request.method == 'POST':
        serializer = RegistrationSerializer(data=request.data)
        data = {}
        if serializer.is_valid():
            user = serializer.save()
            data['response'] = "注册成功"
            data['username'] = user.username
            data['email'] = user.email
        else:
            data = serializer.errors  # 返回验证错误信息
        return Response(data)  # 用Response统一封装返回内容

2. 修复 password2 相关的 TypeError 错误

Django 默认的 User 模型没有password2字段,直接通过序列化器保存会把该字段传给 User 构造方法导致报错。需要在RegistrationSerializer中重写create方法,手动处理密码验证逻辑:

from rest_framework import serializers
from django.contrib.auth.models import User

class RegistrationSerializer(serializers.ModelSerializer):
    password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'password', 'password2']
        extra_kwargs = {
            'password': {'write_only': True}
        }

    def create(self, validated_data):
        # 移除password2字段,避免传给User模型
        password2 = validated_data.pop('password2')
        password = validated_data['password']
        
        # 验证两次输入的密码一致
        if password != password2:
            raise serializers.ValidationError({'password': '两次输入的密码不匹配'})
        
        # 创建用户并正确设置密码
        user = User.objects.create(**validated_data)
        user.set_password(password)
        user.save()
        return user

以上修改后,既解决了密码验证的 TypeError,也确保视图始终返回合法的 Response 对象,不会再触发 AssertionError。

内容的提问来源于stack exchange,提问作者Ritika Jagtap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:25:46