如何扩展Django FlatPage视图以包含另一个上下文?

时间:2014-07-08 05:39:24

标签: django twitter-bootstrap carousel django-templates django-flatpages

我正在尝试扩展flatpage django应用程序以包含一些bootstrap轮播功能。 此时我创建了一个名为“carousel”的新django应用程序,在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)

在carousel / 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已经有了一个视图,所以我无法创建一个视图来将这些图像传递给模板。 我不知道是否有办法扩展视图以包含其他上下文。

一个Stackoverflow 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)

感谢您提供的所有帮助,

伊万

1 个答案:

答案 0 :(得分:2)

您已经错过了模板标签建议的重点。关键是不要将图像从上下文传递到标记中,反之亦然:查询标记中的图像,然后将其传递到上下文中。

执行此操作的最佳方法是使用包含标记而不是简单标记:包含标记与其自己的模板片段相关联,它使用自己的上下文呈现,因此您可以包含与您的轮播相关的所有元素,从完整的平面模板中,您只需要调用标签本身。

虽然实际上现在我再次看你的问题,但我意识到你甚至不需要这样做。您有从平面到图像的外键:您可以获取包含page.carouselimage_set.all的页面的图像。这使得模板标签无关紧要。