/api/register/ 'module' 对象的类型错误不可调用

问题描述

我正在尝试使用 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...