这似乎是一件很基本的事情,所以我希望这是一个简单的答案...抱歉,如果这很愚蠢。
我有一个称为Item的模型。它具有标题,正文,链接等。但是,它也具有属性“类型”,即“视频”,“播客”或“文章”。
此刻,我使用通用类'DetailView'渲染Item的详细信息页面。该模板称为item_detail.html,并从DetailView传递到请求。
我要做的就是让视图根据'type'属性发送不同的模板。因此,如果item.type ='article'呈现文章模板,则如果item.type ='video'呈现视频模板。
仍然可以使用DetailView吗?
这是我在视图中尝试过的:
class ItemDetailView(generic.DetailView):
model = Item
if Item.type == 'video':
template_name = 'curate/item_video.html'
这没有达到我想要的效果-实际上,模板只是正常显示。我想念什么吗?我还考虑过为“视频”,“播客”和“文章”创建一个全新的模型,但我宁愿避免这种情况,并在网站上使用“项”作为强大的内容类型。
views.py
class ItemDetailView(generic.DetailView):
model = Item
if Item.type == 'video':
template_name = 'curate/item_video.html'
models.py
class Item(models.Model):
slug = models.SlugField(unique=True,max_length=1000)
type = models.CharField(max_length=2000,
choices=type_choices,
default='article',
blank=True)
urls.py
path('<int:pk>/', views.ItemDetailView.as_view(), name='item_detail')
答案 0 :(得分:0)
您可以使用get_template_names方法返回条件模板。
class ItemDetailView(generic.DetailView):
model = Item
def get_template_names(self):
item = self.get_object()
if item.type == 'video':
return ['curate/item_video.html']
elif item.type == 'podcast':
return ['curate/item_podcast.html']
...........................
else:
return ['curate/default.html']
另一种方法是在上下文中传递Item对象,并在模板中具有条件。
答案 1 :(得分:0)
您可以使用self.get_object()
中的DetailView
因此代码将如下所示:
def get_template_names(self):
self.object = self.get_object()
if self.object.type == 'video':
return ...
else:
return ...