Как отобразить в шаблоне django данные из подключенных моделей?

У меня есть модели:

class Publication(models.Model):

pub_text = models.TextField(null=True, blank=True)
pub_date = models.DateTimeField(auto_now_add=True)
pub_author = models.ForeignKey(User, on_delete=models.CASCADE)
coor_text = models.CharField(null=True, blank=True)
coor_adress = models.CharField(null=True, blank=True)
coor_coordinates = models.CharField(null=True, blank=True)

class Image(models.Model):

image = models.ImageField(upload_to='images', null=True)
image_to_pub = models.ForeignKey(Publication, on_delete=models.CASCADE, null=True, related_name='images')

И у меня есть представление:

def pub_list_view(request):
pubs = Publication.objects.all()
images = Image.objects.all()
context = {"pubs": pubs, "images": images}
return render(request, "epictalk/pub_list.html", context)

И у меня есть шаблон:

{% extends 'epictalk/layout.html' %}

{% содержимое блока %}

{% for pub in pubs %}
    <h1>{{ pub.pub_text }}</h1>
    {% for image in images %}
        <img src="{{ image.image.url }}">
    {% endfor %}
{% endfor %}

{% конечный блок %}

Как отобразить в браузере публикации с подключенными к ним изображениями? Как отобразить в браузере публикации с подключенным к ним первым изображением?

Передавайте публикации только в шаблон:

def pub_list_view(request):
    pubs = Publication.objects.prefetch_related('images')
    return render(request, 'epictalk/pub_list.html', {'pubs': pubs})

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

{% for pub in pubs %}
    <h1>{{ pub.pub_text }}</h1>
    {% for image in pub.images.all %}
        <img src="{{ image.image.url }}">
    {% endfor %}
{% endfor %}

Параметр .prefetch_related(…) [Django-doc] в представлении строго говорить не обязательно, но это повысит производительность, так как мы извлекаем все изображения в одном запросе, а не по одному запросу на каждое изображение. Publication.

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