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
相关产品推荐
相关产品推荐

