问题描述
我正在尝试使用 django rest 框架注册用户,但这是我遇到的错误,请帮助确定问题
类型错误在 /api/register/
“模块”对象不可调用
请求方式:POST
请求网址:http://127.0.0.1:8000/api/register/
Django 版本:3.1.5
异常类型:类型错误
异常值:
“模块”对象不可调用
异常位置:C:\Users\ben\PycharmProjects\buddyroo\lib\site-packages\rest_framework\generics.py,第 110 行,在 get_serializer
Python 可执行文件:C:\Users\ben\PycharmProjects\buddyroo\Scripts\python.exe
Python 版本:3.8.5
下面是RegisterSerializer
from django.contrib.auth.password_validation import validate_password
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.validators import UniqueValidator
class RegisterSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
required=True,validators=[UniqueValidator(queryset=User.objects.all())]
)
password = serializers.CharField(write_only=True,required=True,validators=[validate_password])
password2 = serializers.CharField(write_only=True,required=True)
class Meta:
model = User
fields = ('username','password','password2','email','first_name','last_name')
extra_kwargs = {
'first_name': {'required': True},'last_name': {'required': True}
}
def validate(self,attrs):
if attrs['password'] != attrs['password2']:
raise serializers.ValidationError({"password": "Password fields didn't match."})
return attrs
def create(self,validated_data):
user = User.objects.create(
username=validated_data['username'],email=validated_data['email'],first_name=validated_data['first_name'],last_name=validated_data['last_name']
)
user.set_password(validated_data['password'])
user.save()
return user
和 RegisterView.py
from django.contrib.auth.models import User
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated,AllowAny # <-- Here
from rest_framework.response import Response
from rest_framework.views import APIView
from api import UseRSSerializer,RegisterSerializer
class RegisterView(generics.CreateAPIView):
queryset = User.objects.all()
serializer_class = RegisterSerializer
permission_classes = (AllowAny,)
解决方法
我假设定义 RegisterSerializer 的模块(文件)的名称是 RegisterSerializer.py。
如果是这种情况,则在 RegisterView.py 中,您将导入模块 RegisterSerializer 而不是类。
所以应该是
import React,{ useEffect,useState } from 'react'
const SuccessToaster = props => {
useEffect(() => {
const id = setTimeout(() => {
props.removeToaster(props.id);
},3000);
return () => clearTimeout(id);
},[]);
return <h1>{props.message}</h1>
}
const App = () => {
const [toasters,setToasters] = useState([]);
console.log(toasters);
const addNewToaster = () => {
setToasters([...toasters,{
id: Math.floor(Math.random() * 10000),message: 'Hello World'
}]);
}
const removeToaster = id => {
setToasters(toasters.filter(toaster => toaster.id !== id))
}
const clearToasters = () => {
setToasters([]);
}
return (
<React.Fragment>
<button onClick={addNewToaster}>Add Toaster</button>
<button onClick={clearToasters}>Clear Toasters</button>
{toasters.map((toast,i) => <SuccessToaster key={toast.id} removeToaster={removeToaster} {...toast} />)}
</React.Fragment>
)
}
export default App;
在 Python 中,一个模块中有多个类是很常见的,因此我建议您将模块重命名为 serializers.py 和 views.py,并将所有序列化程序和视图放在那里。
当然,如果它们很多,您可以将其拆分并创建序列化程序/视图包并在其中放置多个序列化程序/视图模块:user_serializers.py、whaterver_serializers.py...