You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用django-contrib-comments时自定义Account模型无get_username属性报错如何解决

问题原因
  • django-contrib-comments的默认post_comment视图逻辑中,会自动调用当前登录用户的get_full_name()和get_username()方法填充评论的用户名信息
  • Django自带的AbstractBaseUser仅提供了核心的身份认证相关逻辑,没有内置get_full_name()、get_username()这两个方法,只有更高层的AbstractUser才默认实现了这两个方法。你自定义的Account模型直接继承自AbstractBaseUser,没有手动实现这两个方法,因此触发属性不存在的报错
  • 该报错和Poller模型的外键关联没有关系,错误触发对象是当前请求的登录用户request.user
解决方案

推荐优先选择方案一,无需修改第三方包或视图逻辑,兼容性最好:

方案一:自定义Account模型中补充缺失的方法

在你的Account模型定义中添加两个方法的实现即可,示例代码如下:

class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name='email', max_length=60, unique=True)
    username = models.CharField(max_length=40, unique=True)
    # 继承AbstractBaseUser必须配置USERNAME_FIELD,指定作为登录标识的字段
    USERNAME_FIELD = 'username'
    # 你的其他原有字段和逻辑...
    
    # 补充get_full_name方法
    def get_full_name(self):
        # 如果你有存储用户全名的字段可直接返回对应字段,没有的话返回用户名即可
        return self.username
    
    # 补充get_username方法
    def get_username(self):
        # 返回你设定的用户名字段值即可
        return getattr(self, self.USERNAME_FIELD)

修改后重启服务即可正常调用。

方案二:重写post_comment视图

如果你不想修改用户模型,可以覆盖django-contrib-comments默认的post_comment视图,修改获取用户名的逻辑,直接取Account模型的字段:

# 你自己的views.py中重写视图
def custom_post_comment(request, next=None, using=None):
    data = request.POST.copy()
    if request.user.is_authenticated:
        if not data.get('name', ''):
            # 直接取Account模型的username字段,无需调用方法
            data["name"] = request.user.username
    # 剩下的逻辑和原post_comment保持一致即可

之后修改路由配置,把原来指向django-contrib-comments的post_comment的路由,替换为你自己写的custom_post_comment视图即可。


内容的提问来源于stack exchange,提问作者JSRB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:39:02