2016-09-05 11 views
0

Djangoで非常に単純なヒットカウントモデルを実装します。Djangoはクラス属性とインスタンスプロパティをモデル化していますか?

models.py

from django.db import models 

from model_utils.models import TimeStampedModel 

from posts.models import Post 


class PostHit(TimeStampedModel): 
    post = models.ForeignKey(Post, related_name='post_hits') 
    num_of_hit = models.IntegerField() 

    class Meta: 
     verbose_name_plural = "Post hits" 

    def __str__(self): 
     return self.post.title 

    def increase_hit(self): 
     self.num_of_hit += 1 

views.py

from django.views.generic.detail import DetailView 
from django.core.exceptions import ObjectDoesNotExist 

from posts.models import Post, PostHit 
from posts.forms import CommentForm 


class PostDetailView(DetailView): 
    model = Post 

    def get_context_data(self, *args, **kwargs): 
     context = super().get_context_data(**kwargs) 
     context['category'] = self.kwargs['category'] 
     context['form'] = CommentForm() 
     context['tracking_hit_post'] = self.tracking_hit_post() 
     return context 

    def tracking_hit_post(self): 
     post = self.model.objects.get(pk=self.object.id) 
     post_hit = PostHit.objects.filter(post=post).first() 
     if post_hit: 
      post_hit.increase_hit() 
     else: 
      post_hit = PostHit.objects.create(
       post=post, 
       num_of_hit=1 
      ) 
     print(post_hit.num_of_hit) 
     return post_hit.num_of_hit 

PostHitインスタンスが作成されたら、それは私がDetailVieを訪問increase_hit()毎回を呼び出します。

しかし、それは正しい方法ではありません。

最初に印刷します。ページをリフレッシュすると2が印刷されます。次にリフレッシュすると、2がもう一度印刷されます。 2の後にはもう増加しません。

私のコードには何が問題なのですか?クラス属性とインスタンスプロパティを誤解しましたか?

答えて

2

あなたはそれを更新した後、モデルを保存する必要があります。

def increase_hit(self): 
    self.num_of_hit += 1 
    self.save() 

そうでない場合は、変更が唯一のオブジェクトの寿命のために持続します。

+0

ありがとうございました! – user3595632

関連する問題