链接Django模型:如何根据特定模型格式化模板上的结果

时间:2017-09-27 15:06:36

标签: python django django-templates django-views django-template-filters

我有一个视图,允许我一次使用两个不同的模型,这要归功于itertools链。我正在我的模板中的表格中渲染两个链式模型的实例,并且我需要对表格的行进行不同的格式化,以防实例来自一个模型而不是另一个模型。

所以基本上:我正在链接两个模型并在表中显示它们的实例,包含模型A实例的表的所有行都应该用黄色背景格式化,所有包含模型B实例的行应该有一个蓝色的背景。

这是观点:

class BaseView(generic.ListView):
    template_name = 'base/base_list.html'
    context_object_name = 'base_list'

    def get_queryset(self):
         queryset = Document.objects.order_by('due_date')
         return queryset

    def get_context_data(self, **kwargs):
         context = super(BaseView, self).get_context_data(**kwargs)
         context['object_list'] = sorted(
             itertools.chain(Program.objects.all(), Document.objects.all()),
             key=attrgetter('validity_date'),
             reverse=True)
         return context

在逻辑上,我在模板中需要的是这样的东西:

if 
    object in object_list ***belongs*** to Program.objects.all() 

    (etc)

else 

    (etc)

问题是:我应该如何表达 属于

我也研究过模板标签,但找不到正确的方法。

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,您应该寻找一种识别模型本身的方法,而不是检查它是否在列表中。有一种访问模型名称的内置方式,但不幸的是,它位于_meta属性中,并且您不允许使用以模板中的下划线开头的属性。

因此,我建议您只需在类定义中添加一个:

class Program(models.Model):
    model_name = 'Program'
    ...

现在你可以这样做:

{% if object.model_name == 'Program' %}
    ...
{% else %}
    ...
{% endif %}