【问题标题】:Number of Post Views is not showing in template ( Function Based Views )模板中未显示帖子视图的数量(基于函数的视图)
【发布时间】:2021-05-23 04:21:33
【问题描述】:

我正在构建一个 BlogApp,我实现了一个功能来计算 Post 的视图。但是浏览器的帖子页面中没有显示视图。

我要做什么

我正在尝试计算用户访问时帖子获得的观看次数。

问题

浏览器的帖子页面中未显示帖子视图。

我尝试了什么

1)。我还尝试了 models.IntegerField 但对我不起作用,因为每当用户刷新页面时,它每次都会为单个用户增加一个视图。

2)。我遵循了一些教程,但所有教程都在 Class Based Views 上,我正在使用 Function Based Views

3)。然后我想到了IP address 但它也对我不起作用,因为它不适用于我的服务器。

然后我想到了views 变量中的ManyToManyField。但它也不适合我,我不知道问题出在哪里。

views.py

def detail_view(request,pk):
    data = get_object_or_404(BlogPost,pk=pk)
    queryset = BlogPost.objects.order_by('viewers')
    context = {'queryset':queryset,'data':data}
    return render(request, 'mains/show_more.html', context )

models.py

class BloPost(models.Model):
    post_owner = models.ForeignKey(User,default='',null=True,on_delete = models.CASCADE)
    date_added = models
    viewers = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='viewed_posts',editable=False)

show_more.html

1)。这是显示auth.User.None

{{ data.viewers }}

2)。这是显示所有帖子。

{{ queryset }}

我不知道我做错了什么。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • {{ data.viewers.count }} 将为您提供相关实例的计数。
  • 感谢您的评论。但是它一直显示0
  • @Progam:当然,您永远不会向viewers 添加任何用户。究竟为什么要使用 FBV?
  • 我想让它自动统计浏览量。

标签: python html django django-models django-views


【解决方案1】:

你应该注释你的查询集,所以:

from django.db.models import Count

def detail_view(request,pk):
    queryset = BlogPost.objects.annotate(
        num_views=Count('viewers')
    ).order_by('-num_views')
    data = get_object_or_404(queryset, pk=pk)
    context = {'queryset':queryset,'data':data}
    return render(request, 'mains/show_more.html', context )

然后你可以用:

{{ data<b>.num_views</b> }}

如果您想将用户添加到查看器,您可以运行将用户添加到查看器的逻辑:

from django.db.models import Count

def detail_view(request,pk):
    queryset = BlogPost.objects.annotate(
        num_views=Count('viewers')
    ).order_by('-num_views')
    data = get_object_or_404(queryset, pk=pk)
    if self.user.is_authenticated:
        __, created = Post.viewers.through.objects.get_or_create(
            post=data,
            user=self.request.user
        )
        if created:
            data.num_views += 1
    context = {'queryset':queryset,'data':data}
    return render(request, 'mains/show_more.html', context )

话虽如此,这在一定程度上表明基于函数的视图通常不适合需要运行由多个独立部分组成的逻辑的视图。在这种情况下,最好使用 mixins 并根据这些 mixins 定义基于类的视图。

【讨论】:

  • 将用户添加到博客帖子的查看者。我认为 OP 没有这样做。
  • @Progam:是的,它是num_views,而不是num_view
  • 我也这样做了num_views
  • @Progam:不,我的意思是模板部分有错字...
  • 好吧好吧我明白了
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多