2017-09-30 2 views
0

Ich erstelle einen Blog mit Django, und ich möchte die Ansichten für jeden Beitrag zählen. Ich nenne diese Funktion, wenn ein Benutzer liest den Blog-Eintrag:fix django Ansichten Zähler

def post_detail(request, post_id): 
    if 'viewed_post_%s' % post_id in request.session: 
     pass 
    else: 
     print "adding" 
     add_view = Post.objects.get(id=post_id) 
     add_view.views += 1 
     add_view.save() 
    request.session['viewed_post_%s' % post_id] = True 
    return render(request, 'blog/detail.html', {'Post': Post.objects.get(id=post_id)}) 

Das Problem ist, dass, wenn sich abzumelden und sich erneut anzumelden, die Post Ansichten wieder erhöhen. Warum löscht Django die Sitzungen, wenn sich der Benutzer abmeldet und wie kann ich das beheben?

Antwort

0

Sie können sich nicht auf Sitzungen verlassen, um solche permanenten Informationen zu speichern, da sessions vorübergehend sind.

Der einfachste Weg wäre ein zusätzliches Modell hinzuzufügen:

class UserSeenPosts(models.Model): 
    user = models.ForeignKey(User, related_name='seen_posts') 
    post = models.ForeignKey(Post) 

und dann etwas tun, wie folgt aus:

def post_detail(request, post_id): 
    post = Post.objects.get(id=post_id) 

    if not request.user.seen_posts.filter(post_id=post_id).exists(): 
     print "adding" 
     post.views += 1 
     post.save() 
     UserSeenPosts.objects.create(user=request.user, post=post)    

    return render(request, 'blog/detail.html', {'Post': post}) 

Hoffe, es hilft!

+0

nein, es ist zu zählen, auch wenn der Benutzer zuvor die Post angesehen: ( –

+0

i UserSeenPosts im Admin-Panel registriert und Wenn ein Benutzer einen Beitrag anzeigt, erstellt er kein UserSeenPosts-Objekt, warum –

+0

@mohammedqudah siehe bitte die aktualisierte Antwort –

0

ich will Jahongir Rahmonov Antwort bearbeiten, weil es nicht für mich arbeiten die post_detail Funktion:

def post_detail(request, post_id): 
    post = Post.objects.get(id=post_id) 
    if UserSeenPosts.objects.filter(post=post, user=request.user).exists(): 
     pass 
    else: 
     post.views += 1 
     post.save() 
     UserSeenPosts.objects.create(user=request.user, post=post) 
    return render(request, 'blog/detail.html', {'Post': Post.objects.get(id=post_id)}) 
+0

Ihr Code tut das gleiche wie meins, aber es ist länger. –