我正在尝试扩展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)
感谢您提供的所有帮助,
伊万
答案 0 :(得分:2)
您已经错过了模板标签建议的重点。关键是不要将图像从上下文传递到标记中,反之亦然:查询标记中的图像,然后将其传递到上下文中。
执行此操作的最佳方法是使用包含标记而不是简单标记:包含标记与其自己的模板片段相关联,它使用自己的上下文呈现,因此您可以包含与您的轮播相关的所有元素,从完整的平面模板中,您只需要调用标签本身。
虽然实际上现在我再次看你的问题,但我意识到你甚至不需要这样做。您有从平面到图像的外键:您可以获取包含page.carouselimage_set.all
的页面的图像。这使得模板标签无关紧要。