Django博客应用中无法获取并显示当前用户的文章点赞时间问题求助
解决Django中获取当前用户点赞时间的问题
嘿,我来帮你搞定这个问题~你遇到的错误'Likepost' object has no attribute 'request'是因为代码里的逻辑和语法都有问题,咱们一步步来修正:
首先看你的核心错误
你在views里写了All.request.user.date_liked,但All是Likepost的实例对象,它根本没有request属性啊!你要的点赞时间其实就是这个Likepost对象自带的date_liked字段,而且你还犯了两个语法小错误:
if request.user == All.by_user后面没加冒号:- 最后一行
return render(..., context}的闭合括号用成了大括号},应该是小括号)
优化后的解决方案
1. 先优化模型(可选但推荐)
为了避免同一个用户多次点赞同一篇文章,给Likepost模型加个联合唯一约束:
class Likepost(models.Model): by_user = models.ForeignKey(User, on_delete=models.CASCADE) post_of = models.ForeignKey(Post, on_delete=models.CASCADE) date_liked = models.DateTimeField(auto_now_add=True) class Meta: # 限制同一用户不能重复点赞同一篇文章 unique_together = ('by_user', 'post_of')
2. 修正视图函数
不用遍历所有点赞记录,直接用查询过滤当前用户的点赞,效率更高:
from django.shortcuts import get_object_or_404, render def blog_post_detail(request, post_id): obj = get_object_or_404(Post, pk=post_id) # 直接过滤当前用户对这篇文章的点赞记录,取第一条(因为有唯一约束,最多一条) user_like = obj.likepost_set.filter(by_user=request.user).first() # 提取点赞时间,如果用户没点赞就设为None liked_date = user_like.date_liked if user_like else None context = { 'obj': obj, 'liked_date': liked_date } return render(request, 'blog_post_detail.html', context)
3. 模板中显示点赞时间
在blog_post_detail.html里,根据liked_date的值来显示内容:
{% if liked_date %} <p>你在 {{ liked_date|date:"Y-m-d H:i:s" }} 点赞了这篇文章</p> {% else %} <p>你还没点赞这篇文章哦</p> {% endif %}
为什么这样改?
- 直接用
filter(by_user=request.user)查询比遍历所有点赞记录高效得多,尤其是当文章点赞数多的时候 - 利用
first()方法可以直接拿到当前用户的点赞记录(如果有的话),避免了循环判断的冗余 - 修正了语法错误,同时让逻辑更清晰
内容的提问来源于stack exchange,提问作者Onsem
相关产品推荐
相关产品推荐

