如果有多个视频被同一用户添加了书签,则以下html代码无法在“书签”和“未添加书签”之间切换。
如何更改以下 if循环,以检查该特定用户是否已对此特定视频添加了书签,而不是通常具有书签视频的用户?
<td>
<form method='POST' action="{% url 'view:favourite' details.id %}">
{% csrf_token %}
<input type='hidden'>
{% if user.fav_videos.exists %}
<button type='submit'>UnBookmark</button>
{% else %}
<button type='submit'>Bookmark</button>
{% endif %}
</form>
</td>
models.py
class Post(models.Model):
favourite = models.ManyToManyField(User, related_name="fav_videos", blank=True)
urls.py
path('favourite_post/<int:fav_id>', views.favourite_post, name='favourite_post')
views.py
def favourite_post(request, fav_id):
post = get_object_or_404(Post, id=fav_id)
if request.method == 'POST':
if post.favourite.filter(id=request.user.id).exists():
post.favourite.remove(request.user)
else:
post.favourite.add(request.user)
# Rest code
return HttpResponseRedirect(reverse('detailview', args=(fav_id,)))
views.py
中的详细类class DetailView(LoginRequiredMixin, DetailView):
context_object_name = "details"
model = Post
template_name = "detail.html"
评论答案: @Daniel和@andreihondrari都可以正常工作,其中一个效率更高。
答案 0 :(得分:2)
您可以创建一个模板过滤器,例如:
@register.filter
def is_bookmarked(video, user):
return user.fav_videos.filter(id=video.id).exists()
然后像下面这样在模板中使用它:
{% if detail|is_bookmarked:user %}
答案 1 :(得分:2)
您可以编写一个模板标签来查询每个视频,并查找该视频的用户中是否包含该用户,但这并不是很有效。一次性获得用户的收藏夹列表并将其传递到模板可能要容易得多:
favourite_ids = request.user.fav_videos.values_list('id', flat=True)
并在模板中:
{% if detail.id in favourite_ids %}