python - 如何在 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')
在此先感谢您的帮助!
解决方案
我将它作为模型实现,我不确定这是不是最好的方法,但它对我有用。
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 %}
推荐阅读
- mongodb - mongoose pre 中间件不执行 next
- java - 如何使用命令行启用 chromeOptions.EnableMobileEmulation(device)?
- kubernetes - 动态或以编程方式从 kubernetes pod 卸载/分离持久卷声明并将其分配(安装/附加)到另一个 pod
- jsf - 通过停用 jsf 中的命令按钮未触发操作
- android - Android:如何修复“javax.crypto.AEADBadTagException”?
- next.js - 棱镜模型生成 -
- c++ - 在抛出 'std::system_error 的实例后调用终止
- asp.net-web-api - swagger 不显示使用 IFormfile 和其他参数的上传文件,这是一个对象
- android - 从 Dagger 迁移到 Hilt 时如何提供 Application 类
- php - 需要 HTTP/1.1 426 升级 - Apache2 服务器 (debian 9) 上的 file_get_contents (PHP)