如何访问Django Model字段值?

时间:2019-04-02 09:43:06

标签: python django

如果有多个视频被同一用户添加了书签,则以下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都可以正常工作,其中一个效率更高。

2 个答案:

答案 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 %}