2016-05-23 65 views
0

我有以下类:Django:DetailView,在哪里更新计数器?

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

+0

你最好定义这个计数器法到模型ImageGallery本身或定义自定义管理它。以防万一保持逻辑不在视图部分。 – sheshkovsky

+0

@sheshkovsky我分享你的想法。你想分享如何在模型ImageGallery本身做到这一点最简单的例子吗?我会很感激,并接受它作为我的问题的答案:-) – gglasses

+0

我写了我的想法作为答案。但是我不确定你应该在你的观点中把这些方法称为什么。 – sheshkovsky

回答

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官方文档获取更多信息。

+0

我更喜欢第一种方法,那就是'ImageGallery'本身的一部分。但是,再次,你从哪里调用函数'update_counter'? – gglasses

+0

在'get_context_data'中调用方法,然后将其作为上下文字典的一部分传递给模板,如果您需要在模板中显示'count'值。 – sheshkovsky

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