Django - url родительского поля imageField не отображается в шаблоне

Это структура моей модели.

Institution
 - name
 - logo
 - ....

Course
 - Owner ( foriegnKey with Institution )
 - name
 - terms
 - .....

Теперь я просто вызываю данные, например.

courses = Course.objects.filter(name__icontains=query).values('id','name','terms','owner__name', 'owner__logo')

И пытаюсь отобразить логотип владельца как {{data.owner__logo.url}}. Но это не работает, так как img src показывает (неизвестно). Но когда этот Institution logo работает на другом представлении, когда я вызываю его напрямую, но когда я вызываю через отношения, он не работает

Если я использую {{data.owner__logo}}, то он просто передает url без полного пути. Как заставить это работать, пожалуйста, помогите !

Подход, который сработал для меня после экспериментов, заключается в следующем...

# Use the FK object id (owner_id) since you're dealing with a FK.
courses = Course.objects.filter(name__icontains=query).values('id','name','terms','owner_id')

Если вы должны распечатать courses dictionary, вы увидите fields, которые он содержит для каждого курса. В этом случае вы увидите FK с id, перечисленными для этого object. Пример:

{'id': 10, 'owner_id': 7, 'name': 'Random', 'terms': 'Anything', ...}

Что я сделал дальше, поскольку courses object является dictionary, я добавил новый key с value, который является логотипом url.

for course in courses:
     # First is to get the owner object with the course['owner_id']
     owner = Institution.objects.get(id=course['owner_id'])

     # From the owner object, you have access to the logo and it's URL
     # Creating a new key called 'logo_url' and assigning the owner logo URL to it
     course['logo_url'] = owner.logo.url  

# Add the courses dictionary to the context variable
context['courses'] = courses

Затем внутри вашего шаблона вы можете получить доступ к logo_url для каждого course.

{% for course in courses %}
     <img src="{{ course.logo_url }}"/>
{% endfor %}

ВАРИАНТ №2: БОЛЕЕ ЭФФЕКТИВНЫЙ СПОСОБ

Следующий вариант - использовать template filter для получения Institution object логотипа url за один раз, пока вы перебираете элементы в шаблоне.

В вашем custom_tags.py файле:

from django import template
from django.shortcuts import get_object_or_404

register = template.Library()

@register.filter
def get_logo_url(bypass, owner_id):
     # owner = Institution.objects.get(id=owner_id)
     # or
     owner = get_object_or_404(Institution, id=owner_id) # Recommended
    
     if owner:
          url = owner.logo.url
     else:
          url = ""

     return url

В вашем template и for loop.

{% load custom_tags %}  # Must do to be able to use the custom filter


{% for course in courses %}
     {% with logo_url=""|get_logo_url:course.owner_id %}
          <img src="{{ logo_url }}" />
     {% endwith %}
{% endfor %}

Если вы не знакомы с django пользовательскими tags и filters, вы можете посмотреть документ здесь.

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