1

我正在尝试扩展平面 django 应用程序以包含一些引导轮播功能。在这一点上,我创建了一个名为“carousel”的新 django 应用程序,在 model.py 中我定义了一个名为“CarouselImage”的模型类,它有一个用于上传轮播图像的 ImageField 和一个用于 FlatPage 的 ForeignKey。

模型.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

管理员.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 指出了模板标签的创建,所以我尝试创建一些模板标签,但如果我不能将这些图像作为上下文传递给模板,那么模板标签将不起作用。

模板标签/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)

感谢您提供的所有帮助,

伊万

4

1 回答 1

2

您错过了模板标签建议的要点。重点不是将图像从上下文传递到标签中,而是反过来:查询标签中的图像,然后将它们从那里传递到上下文中。

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

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

于 2014-07-08T07:30:38.483 回答