Django属性错误:'function'对象无'__self__'属性求助
解决Django中'function' object has no attribute 'self'的属性错误
我之前也碰到过一模一样的错误,大概率是你用的RGBColorField这个第三方字段库和当前Django版本不兼容导致的。老的第三方字段库往往没跟上Django的版本更新,在字段初始化、绑定表单组件的逻辑上出现了属性访问错误,比如尝试访问已经被移除的__self__属性。
下面给你几个可行的解决思路:
先排查第三方库兼容性
先确认你装的rgbfield版本支持当前Django版本吗?比如Django 3.x之后对字段的底层逻辑做了不少调整,很多停更的老库都会出这类问题。如果发现它已经几年没维护了,那基本可以确定是版本适配的锅。替换为自定义RGB颜色字段(推荐)
既然rgbfield不靠谱,不如自己写个简单的自定义字段,稳定又好用:from django.db import models from django import forms class RGBColorField(models.CharField): def __init__(self, *args, **kwargs): # 固定存储#RRGGBB格式的字符串,长度为7 kwargs['max_length'] = 7 super().__init__(*args, **kwargs) def formfield(self, **kwargs): # 表单里用原生的颜色选择器 kwargs['widget'] = forms.TextInput(attrs={'type': 'color'}) return super().formfield(**kwargs)把model里的
RGBColorField换成这个自定义字段就行,既保留了颜色选择的功能,又不会有版本兼容问题。处理已有的迁移和数据
如果你已经用旧字段生成过迁移、存过数据,别慌,按下面步骤来:- 先导出数据备份:
python manage.py dumpdata your_app.Category > category_backup.json - 把model里的字段替换成自定义的
RGBColorField或者直接用CharField(max_length=7) - 删除
your_app/migrations/下除了__init__.py之外的所有迁移文件 - 重新生成迁移:
python manage.py makemigrations - 用
--fake-initial跳过初始表创建(避免和现有表冲突):python manage.py migrate --fake-initial - 最后导回数据:
python manage.py loaddata category_backup.json
- 先导出数据备份:
临时救急(不推荐长期用)
如果你暂时必须用原rgbfield库,可以试着修改它的源代码:找到字段类里访问__self__的地方,把xxxx.__self__改成xxxx或者对应的正确属性。但这只是临时方案,后续升级Django还是会出问题,迟早要换。
另外,注意你贴的代码里abbreviation = models.CharField(max_length=4, uni...没写完,记得补全参数(比如unique=True),避免语法错误引发其他问题。
内容的提问来源于stack exchange,提问作者PKA
相关产品推荐
相关产品推荐

