Как расширить представление Django FlatPage для включения другого контекста?
Я пытаюсь расширить приложение django для плоских страниц, чтобы включить некоторые функции начальной загрузки карусели. На этом этапе я создал новое приложение django под названием "carousel", и внутри model.py я определяю класс модели с именем "CarouselImage", который имеет ImageField для загрузки изображений карусели и ForeignKey для FlatPage.
model.py
from django.contrib.flatpages.models import FlatPage
class CarouselImage(models.Model):
image = models.ImageField(upload_to='carousel/')
page = models.ForeignKey(FlatPage)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
active = models.BooleanField(default=True)
def __str__(self):
return str(self.image)
На карусели / admin.py у меня нет никаких проблем, как вы увидите на этом изображении 1.
admin.py
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.models import FlatPage
from .models import CarouselImage
class CarouselInline(admin.TabularInline):
model = CarouselImage
extra = 1
allow_add = True
class FlatPageAdminWithCarousel(FlatPageAdmin):
inlines = [CarouselInline]
admin.site.unregister(FlatPage)
admin.site.register(FlatPage, FlatPageAdminWithCarousel)
проблема
В конце концов, что мне нужно знать, как я могу передать эти изображения в шаблон?, Проблема в том, что у FlatPage уже есть представление, поэтому я не могу создать представление для передачи этих изображений в шаблон. Я не знаю, есть ли способ расширить представление, чтобы включить другой контекст.
Один из Stackru QA указывал на создание тегов-шаблонов, поэтому я попытался создать некоторые теги-шаблоны, но если я не могу передать эти изображения в качестве контекста в шаблон, теги-шаблоны не будут работать.
templatetags / add_carousel.py
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def carousel(context):
image = context['image']
return str(image)
Спасибо за всю помощь, которую вы можете оказать,
Iván
1 ответ
Вы упустили смысл советов по тегам шаблонов. Суть не в том, чтобы передавать изображения из контекста в тег, а наоборот: запрашивать изображения в теге, а затем передавать их в контекст оттуда.
Лучший способ сделать это - использовать тег включения, а не простой тег: тег включения связан с его собственным фрагментом шаблона, который он отображает в своем собственном контексте, поэтому вы можете включить все элементы, относящиеся к вашей карусели, и из полный шаблон плоской страницы вам нужно только вызвать сам тег.
Хотя сейчас я снова смотрю на ваш вопрос, я понимаю, что вам даже не нужно этого делать. У вас есть внешний ключ от плоской страницы к изображению: вы можете получить изображения для страницы с page.carouselimage_set.all
, Это делает тег шаблона неактуальным.