代码之家  ›  专栏  ›  技术社区  ›  Ye K

如何在django模板中按modelname获取模型

  •  1
  • Ye K  · 技术社区  · 7 年前

    我有包含属性的模型登录片段 ...model = CharField()... ,它与上下文关键字(例如 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 在上下文中按关键字 汽车 作为一根弦

    例如

    {{context}}
    

    印刷品

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

    {{snippet.model}}
    

    印刷品

    cars
    

    问题: 我怎样才能得到 {{ context.cars }} ? 我想应该是 context[snippet.model] 其中snippet.model='汽车'

    我想把它推到另一个模板里面

    {% 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 回复  |  直到 7 年前
        1
  •  0
  •   vorujack    7 年前

    您可以编写一个简单的模板标记,如下所示:

    首先在应用程序目录中创建一个名为 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 %}
    
        2
  •  0
  •   Ye K    7 年前

    @沃鲁杰克,我还是有同样的错误。但根据你的解决方案我得到了下一个。

      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

    推荐文章