Как отобразить в шаблоне 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.