Django: использование элементов в списке без выполнения цикла - PullRequest
0 голосов
/ 28 мая 2018

Извиняюсь за неясное название, я не уверен, как сформулировать мой вопрос в нескольких словах.

В принципе, на мой взгляд, у меня есть переменная, содержащая список объектов (фотографий):

photos = Photo.objects.all()

В моем шаблоне у меня есть цикл for для этих объектов, где я отображаю атрибуты (например, photo.author).Я хотел бы иметь некоторую логику для отдельных экземпляров фотографий:

all_likes = Like.objects.all()
for photo in photos:
    pic_likes = all_likes.filter(photo_id=id)
    like_count = len(pic_likes)
    liker = pic_likes.filter(liker_id=request.user.id)
    if len(liker) != 0:
        liked=True

, но использование цикла for внутри представления приводит к ошибке

int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'

Как мне поступить слогика для экземпляров фотографий, но не для списка объектов в целом?

Моя модель "Фото" выглядит следующим образом:

class Photo(models.Model):
    image = models.ImageField(upload_to='uploaded_images', blank=True)
    title = models.CharField(max_length=128)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, default = 1)
    slug = models.SlugField()
    likes = models.ManyToManyField(User, related_name='likes')
    description = models.CharField(max_length=1000, blank=True)

, и моя похожая модель:

class Like(models.Model):
    liker = models.ForeignKey(User, related_name='liker')
    photo = models.ForeignKey(Photo, related_name='photo')
    liked = models.BooleanField()

1 Ответ

0 голосов
/ 28 мая 2018

Я предлагаю вам изменить related_name атрибуты в вашей Like модели, возможно, даже удалить ее, чтобы использовать имена по умолчанию:

class Like(models.Model):
    liker = models.ForeignKey(User)
    photo = models.ForeignKey(Photo)
    liked = models.BooleanField()

Теперь вы можете использовать ее следующим образом:

all_likes_of_a_user = user_instance.like_set.all()
all_likes_of_a_photo = photo_instance.like_set.all()

Теперь, чтобы перебрать фотографии в представлении, вы можете использовать:

for photo in Photo.objects.all():
    like_count = photo.like_set.count()
    has_liked = photo.like_set.filter(liker=request.user).exists()

А для использования этого в ваших шаблонах вы можете добавить вложенный цикл:

{% for photo in Photo.objects.all %}
    Like count: {{ photo.like_set.count }}
    Has this user liked this photo:
    {% for like in photo.like_set.all %}
        {% if like.liker == user %}
        yes
        {% endif %}
    {% endfor %}
{% endfor %}

Или добавьте метод к вашей Photo модели:

class Photo(models.Model):
    ...
    def users_that_liked_it(self):
        return [
            e.liker.pk
            for e in self.like_set.all()]

{% for photo in Photo.objects.all %}
    Like count: {{ photo.like_set.count }}
    Has this user liked this photo:
    {% if user.pk in photo.users_that_liked_it %}
        yes
    {% else %}
        no
    {% endif %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...