Django - Как выполнить итерацию по объекту, который имеет поле ManyToManyField с User в качестве реляционного аргумента и получить конкретного пользователя?

У меня есть веб-приложение художественной галереи, которое отображает сетку изображений. На каждом изображении указано количество пользователей, которым это изображение "понравилось". Я уже реализовал динамические лайки/нелайки с помощью счетчика int, который увеличивает/уменьшает счетчик в реальном времени через AJAX.

Что я пытаюсь сделать сейчас, но не могу понять, это:

1.) При загрузке страницы, если вошедшему в систему пользователю не понравилось определенное изображение, отображать кнопку "Мне нравится" определенного изображения определенным цветом, например, черным. Но если пользователю, вошедшему в систему, оно понравилось, отобразите кнопку "Мне нравится" другим цветом, скажем, синим, чтобы указать, какие изображения понравились этому пользователю, а какие нет. Так же, как в Facebook или Instagram.

Вот моя модель портрета (некоторые поля опущены):

class Portrait(models.model):
    likes = models.ManyToManyField(User,related_name='like',default=None,blank=True)
    like_count = models.BigIntegerField(default=0)

Вот мой views.py для модели Portrait:

def index(request):
    paintingObjects = Portrait.objects.all()
    context = {
        'paintingObjects': paintingObjects,
    }
    return render(request, "index.html", context)

Вот часть моего шаблона index.html, в которой я хочу выполнить проверку (псевдокод):

{% for paintingData in paintingObjects %}
    {% if request.user.is_authenticated %}
        {% if this current request.user is in this paintingData's 'likes' field %}
        <a role="button" class="like-click" id="{{paintingData.id}}">
            <span style="float: left;" class="p-1 mt-1">
                <i class="fa fa-thumbs-up" style="font-size:22px;color:blue"></i>
            </span>
        </a>
        {% else if the user hasn't liked this particular paintingData yet %}
        <a role="button" class="like-click" id="{{paintingData.id}}">
            <span style="float: left;" class="p-1 mt-1">
                <i class="fa fa-thumbs-up" style="font-size:22px;color:black"></i>
            </span>
        </a>
    {% endif %}
{% endfor %}

В моем поле "likes" модели Portrait, как мне получить доступ к User(s) каждого изображения и проверить, есть ли в списке текущий вошедший пользователь?

Вы можете получить доступ ко всем лайкам пользователя, сделав это :

request.user.like.all

Потому что User является связанным объектом для атрибута like, а related_name называется "like".

Обратите внимание, что вы должны были сделать наоборот, ваш атрибут должен быть сингулярным "like", а связанное_имя плюральным "likes", потому что вы обращаетесь к набору like для конкретного пользователя

Вернуться на верх