在我寻找一种在没有任何第三方库的情况下向我的博客文章添加点击计数器的方法时,我在 StackOverflow 上找到了这个答案。
但是,由于我不是 Django 专家,我无法弄清楚如何在我的视图中使用该 Mixin。
这是我的模型的定义方式:
class Post(models.Model):
STATUS_CHOICES = (('draft', 'Draft'), ('published', 'Published'))
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
而我的观点:
def post_list(request):
posts = Post.published.all()
return render(request, 'blog/post/list.html', {'posts': posts})
class PostDetailView(DetailView):
model = Post
context_object_name = 'post'
这是该答案中提供的混合:
class BlogPostCounterMixin(object):
def get_context_data(self, **kwargs):
context = super(BlogPostCounterMixin, self).get_context_data(**kwargs)
blog_post_slug = self.kwargs['slug']
if not blog_post_slug in self.request.session:
bp = BlogPost.objects.filter(slug=blog_post_slug).update(counter=+1)
# Insert the slug into the session as the user has seen it
self.request.session[blog_post_slug] = blog_post_slug
return context
我会问用户提供了那个答案,但他已经超过 2 年没有活动了。
感谢你的帮助。
你可以在你的模型中创建一个IntegerField
调用views
那么在您post_detail
看来,您可以在 return 语句之前执行此操作
post.views += 1
post.save(update_fields=['views'])
显然,这个解决方案有一些缺点,即某些发生在完全同一时刻的视图被错过了。
编辑:
在使用 mixin 之前,您必须首先使用基于类的视图而不是基于函数的视图,然后您可以使用此 mixin,在您的情况下,您可能想要使用 DetailView
https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-display/#detailview
class BlogPostCounterMixin:
def get_object(self, *args, **kwargs):
# get_object will be available if you use a DetailView
obj = super().get_object(*args, **kwargs):
post_unique_key = 'post_%s' % obj.pk # or whatever unique key is
if not post_unique_key in self.request.session:
obj.views += 1
obj.save(update_fields=['views'])
self.request.session[post_unique_key] = post_unique_key
return obj
并且可以这样使用
class PostDetailView(BlogPostCounterMixin, DetailView):
model = Post
context_object_name = 'post'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句