Как расширить представление 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, Это делает тег шаблона неактуальным.

Другие вопросы по тегам