首页 > 解决方案 > 如何在 Django 模板中实现类似系统

问题描述

我目前正在为 Django 中的博客风格网站构建一个“点赞”系统。我一直在查看设置 HTML 模板的几个不同示例,并希望能更好地理解其中的一些逻辑。

我的第一个想法是将“喜欢”按钮绑定到相应的视图,如下所示:

<a class="btn btn-secondary" href="{% url 'post-like' post.id %}" role="button">Like ({{ post.likes.count }})</a>

这似乎工作得很好(“喜欢”正在注册并显示在计数中)但是我在点击“喜欢”按钮后无法返回正确的页面(即当我点击“喜欢”时,我需要其他页面与停留在主页上)。

然后我在网上找到了另一个示例,该示例get_like_url()在更广泛的范围内创建了一个函数,Post Model如下所示:

def get_like_url(self):
        return reverse("post-like", kwargs={"pk":self.id})

然后像这样在模板中调用它:

<a class="btn btn-secondary" href="{{ instance.get_like_url }}" role="button">Like ({{ post.likes.count }})</a>

我认为这基本上是在做同样的事情,但是当我使用这种方法时,它会将我返回到我网站的主页,但不会注册类似的内容(即,按钮似乎实际上没有做任何事情)。

谁能帮我理解这里发生了什么?

作为参考,这是我View的“喜欢”系统:

class LikeView(View):
    model = Post
    context_object_name = 'posts'

    def get(self, request, pk=None):
        user = self.request.user
        post = Post.objects.get(pk=pk)
        updated = False
        liked = False
        if user.is_authenticated:
            if user in post.likes.all():
                liked = False
                post.likes.remove(user)
            else:
                liked = True
                post.likes.add(user)
            updated = True
        data = {
            "updated": updated,
            "liked": liked,
        }
        return HttpResponse(data)

我的URL pattern

path('post/like/<int:pk>', LikeView.as_view(), name='post-like')

在此先感谢您的帮助!

标签: pythondjangodjango-templates

解决方案


我将它作为模型实现,我不确定这是不是最好的方法,但它对我有用。

class Like(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="likes")
                       
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, 
        related_name="likes")

    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'post'], name="unique_like"),
        ]

我还在使用UniqueConstraint的模型中使用了每个用户的唯一喜欢。您还可以使用genericForeignKey来点赞评论、注释等。

@method_decorator(login_required, name='dispatch')
class LikeView(View):
    def get_success_url(self):
        return reverse("posts:detail", kwargs={"pk": self.kwargs.get("pk")})

    def get(self, request, *args, **kwargs):
        like = Like()
        like.post = get_object_or_404(Post, pk=self.kwargs.get("pk"))
        like.user = self.request.user
        like.save()
        return redirect(self.get_success_url())

在模板中:

{% if request.user.pk not in post.get_likes_users %}
    <a href="{% url 'posts:like' pk=post.pk %}">
        <i class="fa fa-thumbs-up"></i>
        Like
    </a>
{% else %}
    /* dislike implementation*/
{% endif %}

推荐阅读