如何在Django模板中通过模型名称获取模型

时间:2018-08-07 03:16:24

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

我有一个包含属性...model = CharField()...的模型LandingSnippet,它与上下文关键字有关(例如下面cars中的context

我的视图中有下一个代码

def GeneratedLanding(request):
    snippets = LandingSnippet.objects.all().filter(view_on=True).order_by('order')

    context = {
        'snippets':snippets,
        ...
        'cars':Car.objects.all(), # this is cars
        ...
    return render(request,'qlanding/generateindex.html',{'context':context})

如何通过关键字querySet cars作为字符串获取上下文中的cars

例如

{{context}}

打印

{'snippets': <QuerySet [<LandingSnippet: Snippet1Title>, <LandingSnippet: 2 - about - Лучшая служба развозки детей>]>, 'services': <QuerySet []>, 'cars': <QuerySet []>, 'faqs': <QuerySet []>}

{{snippet.model}}

打印

cars

问题: 我如何获得{{ context.cars }}?我认为类似context[snippet.model],其中snippet.model ='cars'

我要在包含时将其推入另一个模板中

{% if snippet.module %}
  {% with "qlanding/snippets/module/"|add:snippet.module|add:".html" as path %}
  {% include path with model=context[snippet.model] %} # But this is incorect while rendering
  {% endwith %}
{% endif %}

2 个答案:

答案 0 :(得分:0)

您可以这样编写一个简单的模板标签:

首先在您的应用程序目录中创建一个名为templatetags的目录,该目录必须包含一个名为__init__.py的空文件

在此目录中创建任何名称的文件。例如load_from_context

在此文件上写这些代码

from django import template

register = template.Library()


@register.tag(name="GetFromContext")
def get_from_context(parser, token):
    bits = token.split_contents()
    node_list = parser.parse(('endGetFromContext',))
    variable = bits[1]
    return GetFromContextNode(node_list, variable)


class GetFromContextNode(template.Node):

    def __init__(self, node_list, variable):
        self.node_list = node_list
        self.variable = variable

    def render(self, context):
        variable_value = template.Variable(self.variable).resolve(context)
        with context.push():
            context['model'] = context.get(variable_value)
            return self.node_list.render(context)

然后在您的模板中可以像这样使用它

{% load load_from_context %}

{# any code in your template #}

{% GetFromContext snippet.model %}
    {% include path %}
{% endGetFromContext %}

答案 1 :(得分:0)

@vorujack,我仍然遇到相同的错误。但根据您的解决方案,我得到了下一步。

  from Django import template
  register = template.Library()
  @register.simple_tag
  def get_model_from_context(context,model_name):
      return context[model_name]

以及我在视图中的用法

 {% get_model_from_context context=context model_name=snippet.model as model %}
 {% include "qlanding/snippets/module/"|add:snippet.module|add:".html" with model=model %}

非常感谢@vorujack