我有以下课程:
class ImageGalleryDetail(DetailView):
model = ImageGallery
template_name = 'galleries/imagegallery_detail.html'
def get_context_data(self, **kwargs):
context = super(ImageGalleryDetail, self).get_context_data(**kwargs)
context['image'] = self.object
context['gallery'] = self.object.owner_gallery
return context
def update_counter(self):
self.object.hits = F('hits') + 1
self.object.save()
正如您所看到的,我有一个名为update_counter()
的方法,其中我使用F expression
以原子方式更新计数器。
我的问题是,我应该在哪里找到对此功能的调用?我看到它的方式我可以在get_context_data()
方法中找到它但对我来说听起来很奇怪,方法的名称以获取而非设置开头。而且我认为我不应该在那里保存与模型相关的东西......(初学者在这里!)
1. dispatch()
2. http_method_not_allowed()
3. get_template_names()
4. get_slug_field()
5. get_queryset()
6. get_object()
7. get_context_object_name()
8. get_context_data()
9. get()
10. render_to_response()
所以老实说我不知道应该覆盖哪种方法来调用update_counter
函数。任何帮助,将不胜感激。或者,如果这是错误的做事方式......我也想知道这一点! :)
答案 0 :(得分:0)
为了保持逻辑不在视图中,您可以定义新的整数字段并将计数器查找器定义为模型方法。
class ImageGallery(models.Model):
...
count = models.PositiveIntegerField(default=0)
def update_counter(self):
self.count = self.count + 1
另一种方法是添加新的自定义管理器:
class ImageGalleryManager(models.Manager):
def update_counter(self, pk):
self.filter(id=pk).update(count=F('count')+1)
class ImageGallery(models.Model):
...
count = models.PositiveIntegerField(default=0)
objects = ImageGalleryManager()
查看Managers官方文档了解更多信息。
答案 1 :(得分:0)
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
obj = self.get_object()
obj.page_click = obj.page_click + 1
obj.save()
return context