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
, вы можете посмотреть документ здесь.