如何基于模型属性使用其他模板渲染模型

时间:2019-04-10 14:26:48

标签: python django templates model

这似乎是一件很基本的事情,所以我希望这是一个简单的答案...抱歉,如果这很愚蠢。

我有一个称为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')

2 个答案:

答案 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 ...