链接 Django 模型:如何根据特定模型在模板上格式化结果
Chaining Django models: how to format results on the template according to the specific model
感谢 itertools 链,我有一个视图允许我同时使用两个不同的模型。我在我的模板中的 table 内渲染两个链接模型的实例,并且我需要 table 的行以不同的格式设置,以防实例来自一个模型而不是给另一个。
所以基本上:我链接两个模型并在 table 中显示它们的实例,table 中包含模型 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)
问题是:属于怎么表达?
我也查看了模板标签,但找不到正确的方法。
提前谢谢你。
正如我在评论中提到的,您应该寻找一种识别模型本身的方法,而不是检查它是否在列表中。有一种访问模型名称的内置方法,但不幸的是,它位于 _meta
属性中,并且不允许在模板中使用以下划线开头的属性。
因此,我建议只在您的 class 定义中添加一个:
class Program(models.Model):
model_name = 'Program'
...
现在你只需要做:
{% if object.model_name == 'Program' %}
...
{% else %}
...
{% endif %}
感谢 itertools 链,我有一个视图允许我同时使用两个不同的模型。我在我的模板中的 table 内渲染两个链接模型的实例,并且我需要 table 的行以不同的格式设置,以防实例来自一个模型而不是给另一个。
所以基本上:我链接两个模型并在 table 中显示它们的实例,table 中包含模型 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)
问题是:属于怎么表达?
我也查看了模板标签,但找不到正确的方法。
提前谢谢你。
正如我在评论中提到的,您应该寻找一种识别模型本身的方法,而不是检查它是否在列表中。有一种访问模型名称的内置方法,但不幸的是,它位于 _meta
属性中,并且不允许在模板中使用以下划线开头的属性。
因此,我建议只在您的 class 定义中添加一个:
class Program(models.Model):
model_name = 'Program'
...
现在你只需要做:
{% if object.model_name == 'Program' %}
...
{% else %}
...
{% endif %}