使用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
相关产品推荐
相关产品推荐

