【问题标题】:Django __str__ returned non-string (type NoneType) when trying to deleteDjango __str__ 尝试删除时返回非字符串(NoneType 类型)
【发布时间】:2021-04-18 20:09:57
【问题描述】:

我收到此错误:__str__ returned non-string (type NoneType) ,但前提是用户是通过 HTTP 发布请求创建的。如果我通过普通的 Django 管理面板创建用户,我可以删除该用户。

我还尝试打印每种类型的 HTTP Post 收入并得到这个:

<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'int'>
<class 'int'>
<class 'str'>

所以每个字段都是一个 str 或一个整数。可能是什么问题?

这是我的模型: 模型.py

class Account(AbstractBaseUser):
    userid = models.AutoField(primary_key=True)
    username = models.CharField(max_length=50, unique=True)
    firstname = models.CharField(max_length=200)
    lastname = models.CharField(max_length=200)
    email = models.EmailField(max_length=45, unique=True)
    verified = models.BooleanField(default=False)
    age = models.IntegerField(default=0)
    

    date_joined = models.DateTimeField(verbose_name="date joined", auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="last login", auto_now=True)
    
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ["firstname", "lastname", "email"]


    objects = MyAccountManager()

    def __str__(self):
        return str(self.username)

    # For checking permissions. to keep it simple all admin have ALL permissons
    def has_perm(self, perm, obj=None):
        return self.is_admin

    # Does this user have permission to view this app? (ALWAYS YES FOR SIMPLICITY)
    def has_module_perms(self, app_label):
        return True

views.py

@api_view(['POST', ])
def registration_view(request):

    if request.method == 'POST':
        serializer = RegistrationSerializer(data=request.data)
        data = {}
        if serializer.is_valid():
            account = serializer.save()
            data['response'] = 'successfully registered new user.'
            data['firstname'] = account[0].firstname
            data['lastname'] = account[0].lastname
            data['email'] = account[0].email
            data['username'] = account[0].username
            data['age'] = account[0].age
            token = Token.objects.get(user = account[0]).key
            data['token'] = token
        else:
            data = serializer.errors
            print(data)
        return Response(data)

serializer.py

class RegistrationSerializer(serializers.ModelSerializer):

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

    class Meta:
        model = Account
        fields = ['firstname', 'lastname', 'email', 'username', 'age', 'password', 'password2']
        extra_kwargs = {
                'password': {'write_only': True}
        }   

    def save(self):
        account = Account(
                firstname = self.validated_data['firstname'],
                lastname = self.validated_data['lastname'],
                email = self.validated_data['email'],
                username = self.validated_data['username'],
                age = self.validated_data['age'],
            )
        password = self.validated_data['password']
        password2 = self.validated_data['password2']
        username = self.validated_data['username']
        if password != password2:
            raise serializers.ValidationError({'password': 'Passwords must match.'})

Not     errors = dict() 
the     try:
error   validate_password(password=password)
->
->      except ValidationError as e:
->          errors['password'] = list(e.messages)
            
        if errors:
            raise serializers.ValidationError(errors)

        account.set_password(password)
        account.save()

【问题讨论】:

  • 分享更多细节和代码
  • 如果你想返回一个字符串,试着把它转换成这样的字符串 "str(string_variable)"
  • 是的,我有这个。我添加了我的模型。如果您需要更多,请写
  • 什么函数是错误的,告诉我你调用函数的代码
  • 这就是问题所在。我不知道。我没有收到错误哪里错误是

标签: django django-rest-framework


【解决方案1】:

向 Yanki Segals 回答添加内容:

None 类型在 Python 中也是空的。也许您有一个函数或任何将值设置为 None 的地方。 None 不是 None -> 对于 Python,它是空的。

【讨论】:

    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多