如题,我用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'
我的问题是:
- 为什么会出现这样的错误?正确的做法应该是什么?
- 选择扩展get_queryset来实现这个需求是否正确?
- 对于类视图,当我需要增加一些自己写的方法时,我应该怎样让程序去调用它?
自己做出来了,写下来以供参考,望指正:
而我们在自己重写的get_queryset()方法中得到的model并非一个queryset,也就不存在filter这样的方法了。
正确的做法应该是重写get_object()方法: