【问题标题】:Chaining Django models: how to format results on the template according to the specific model链接 Django 模型:如何根据特定模型在模板上格式化结果
【发布时间】:2018-03-09 03:30:52
【问题描述】:

感谢 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)

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

我也查看了模板标签,但找不到正确的方法。

提前谢谢你。

【问题讨论】:

  • 您的模型是否有任何独特的识别特征?
  • 不,它们主要共享相同的属性(名称、描述...)。
  • 等等,他们只有一个完全不同的属性,我可以用那个吗?

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


【解决方案1】:

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

因此,我建议您在类定义中简单地添加一个:

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

现在你可以这样做了:

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

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多