Django Показать первый элемент из списка related_name - PullRequest
1 голос
/ 19 сентября 2019

Я работаю над проектом с использованием Python (3.7) и Django (2.2), в котором я реализовал две модели ItemModel и Images, поэтому у каждого элемента будет несколько изображений и добавлен элемент в модель imagesи добавьте related_name, но когда я пытаюсь получить доступ к этим изображениям в шаблоне Django, он не предоставляет никакой информации относительно этих изображений.

Вот мои модели: С models.py:

class ItemModel(models.Model):
    stock_number = models.IntegerField(blank=False)
    title = models.CharField(max_length=255, blank=False)
    price = models.IntegerField(blank=False)
    description = models.TextField(max_length=1000)
    condition = models.CharField(max_length=255, choices=COND_CHOICES, blank=False)
    model = models.CharField(max_length=255)
    dimensions = models.CharField(max_length=255)
    make = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title


class Images(models.Model):
    item = models.ForeignKey(ItemModel, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to=images_directory_path)

Обновление: Вот функция, которую я использую для переименования изображений:

def images_directory_path(instance, filename):
    return '/'.join(['images', str(instance.item.id), str(uuid.uuid4().hex + ".png")])

И вот я пытаюсь получить доступ к этимизображения для элемента в шаблоне:

{% for img in item.images.all %}
    {% if forloop.first %}
        <td> {{ item.images.first.name }}</td>
    {% endif %}
{% endfor %}

Вот вид:

От views.py:

class Inventory(View, LoginRequiredMixin):
    def get(self, request):
        items = None
        try:
            items = ItemModel.objects.all()
        except ItemModel.DoesNotExist:
            return redirect('home')

        return render(request, 'app/inventory.html', {'all_items': items})

что может бытьздесь не так?

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Похоже, вам просто нужно

{% for img in item.images.all %}
    {% if forloop.first %}
        <td> <img src="{{ img.image.url }}"/> </td>
    {% endif %}
{% endfor %}
0 голосов
/ 19 сентября 2019

в дополнение к ответу Ракеша, вам может понадобиться проверить, существует ли изображение, прежде чем извлекать его, добавив еще один оператор if.

В вашем шаблоне сделайте это;

{% for img in item.images.all %}
   {% if forloop.first %}
    {# add this if statement to check if the image exists in the table #}
       {% if img.image %}     
         <td><img src="{{ img.image.url }}"/></td>
       {% endif %}
   {% endif %}
 {% endfor %}
0 голосов
/ 19 сентября 2019

Вам не нужен цикл for

<td> {{ item.images.first.name }}</td>

Подойдет, поскольку он вернет первое изображение (если оно существует) без необходимости циклически повторять каждое изображение

...