【问题标题】:How do I render a model with a different template based on a model attribute如何根据模型属性使用不同的模板渲染模型
【发布时间】:2019-09-01 01:25:02
【问题描述】:

这似乎是一个非常基本的事情,所以我希望这是一个直截了当的答案......对不起,如果这是愚蠢的。

我有一个名为 Item 的模型。它有标题、正文、链接等。但是,它也有一个属性“类型”,即“视频”、“播客”或“文章”。

目前,我使用通用类 'DetailView' 来呈现 Item 的详细信息页面。该模板名为 item_detail.html,并从 DetailView 传递给请求。

我要做的就是让视图根据“类型”属性发送不同的模板。所以如果 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')

【问题讨论】:

    标签: python django templates model


    【解决方案1】:

    您可以使用 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 对象并在模板中设置条件。

    【讨论】:

    • 谢谢 - 我知道这很简单。那是给我一个模型未定义的错误。即使我把“项目”或“项目”放在那里。
    • 您需要使用 get_object() 来使用当前对象。 model 确实是 Item 的一个类。对此感到抱歉。
    【解决方案2】:

    你可以从DetailView使用self.get_object()

    所以代码将如下所示:

    def get_template_names(self):
        self.object = self.get_object()    
        if self.object.type == 'video':
            return ...
        else:
            return ...
    

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2021-10-14
      • 2023-03-11
      相关资源
      最近更新 更多