Как получить доступ к значению поля Django Model? - PullRequest
0 голосов
/ 02 апреля 2019

В следующем html-коде не удается переключиться между «Закладка» и «Без закладки», если один и тот же пользователь добавил в закладки более 1 видео.

Как я могу изменить следующее if loop , чтобы проверить, добавил ли этот конкретный пользователь в закладки это конкретное видео, а не пользователя, имеющего видео, добавленное в закладки в целом?

<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 ]

2 голосов
/ 02 апреля 2019

Вы можете написать тег шаблона для запроса каждого видео и определения, включен ли пользователь в список пользователей, которые его одобрили, но это не очень эффективно. Вероятно, гораздо проще получить список избранного пользователя за один раз и передать его шаблону:

favourite_ids = request.user.fav_videos.values_list('id', flat=True)

и в шаблоне:

{% if detail.id in favourite_ids %}
2 голосов
/ 02 апреля 2019

Вы можете создать фильтр шаблона, например:

@register.filter
def is_bookmarked(video, user):
    return user.fav_videos.filter(id=video.id).exists()

, а затем использовать его в своем шаблоне, например:

{% if detail|is_bookmarked:user %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...