Django如何在类视图中实现文章浏览量的自增

如题,我用Django搭建了一个博客网站。我希望完成这样一个需求:当我点击某一篇博客时,该文章的阅读量自增。
下面是我的部分代码:

# models.py
class Blog(models.Model)
    views = models.PositiveIntegerField(default=0)
    
    def increase_views(self):
        self.views += 1
        self.save(update_field=["views"])
# views.py
class BlogDetailView(generic.DetailView):
    
    def get_queryset(self):
        pk = self.kwargs.get("pk")
        model = Blog.objects.get(id=pk)
        model.increase_views()
        return model

如上,我在models中定义一个类方法,用于阅读量自增(只是简单的实现),在views中定义博客详情页面的视图,当我点击某一篇博客时,调用get_queryset方法。在数据库中,阅读量确实增加了。但是我得到一个这样的错误

AttributeError: 'Blog' object has no attribute 'filter'

我的问题是:

  1. 为什么会出现这样的错误?正确的做法应该是什么?
  2. 选择扩展get_queryset来实现这个需求是否正确?
  3. 对于类视图,当我需要增加一些自己写的方法时,我应该怎样让程序去调用它?
阅读 1.8k
1 个回答

自己做出来了,写下来以供参考,望指正:

  1. BlogDetailView继承自DetailView,当BlogDetailView被调用时,会运行父类DetailView的父类BaseDetailView中的get()方法,get()调用了get_object()方法,get_object()中,对queryset进行了筛选:
def get_object(self, queryset=None):
    if pk is not None:
        queryset = queryset.filter(pk=pk)
        ...

而我们在自己重写的get_queryset()方法中得到的model并非一个queryset,也就不存在filter这样的方法了。
正确的做法应该是重写get_object()方法:

def get_object(self):
    model = super(BlogDetailView, self).get_object()
    model.auto_increment_views()
    return model
  1. 关于如何扩展类视图的方法这一点,仍然不是很清晰。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题