Django:DetailView,更新计数器的位置?

时间:2016-05-23 16:54:37

标签: python django

我有以下课程:

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()方法中找到它但对我来说听起来很奇怪,方法的名称以获取而非设置开头。而且我认为我不应该在那里保存与模型相关的东西......(初学者在这里!)

DetailView的

Method Flowchart如下:

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函数。任何帮助,将不胜感激。或者,如果这是错误的做事方式......我也想知道这一点! :)

2 个答案:

答案 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)

如果您的模型包含page_click字段

,请在详细视图中

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