【问题标题】:How to get object from PK inside Django template?如何从 Django 模板中的 PK 获取对象?
【发布时间】:2012-12-01 18:17:43
【问题描述】:

在 django 模板中,我想使用对象的 pk 获取对象的名称。例如,假设我有来自 A 类的 pk 对象,我想执行以下操作:

{{ A.objects.get(pk=A_pk).name }}

我该怎么做?

【问题讨论】:

  • 这不可能,你应该在你的views.py中这样做:a = A.objects.get(pl=A_pk)然后在你的模板中显示它:{{ a.name }}

标签: python django django-templates


【解决方案1】:

来自The Django Template Language 上的文档:

Accessing method calls:

由于 Django 有意限制模板语言中可用的逻辑处理量,因此无法将参数传递给从模板中访问的方法调用。数据应该在视图中计算,然后传递给模板进行显示。

所以你看,你应该在你的views.py:中计算这个

def my_view(request, A_pk):
    ...     
    a = A.objects.get(pk=A_pk)    
    ...
    return render_to_response('myapp/mytemplate.html', {'a': a})

在你的模板中:

{{ a.name }}
{{ a.some_field }}
{{ a.some_other_field }}

【讨论】:

    【解决方案2】:

    您可以根据需要添加自己的标签。像这样:

    from django import template
    register = template.Library()
    
    @register.simple_tag
    def get_obj(pk, attr):
        obj = getattr(A.objects.get(pk=int(pk)), attr)
        return obj
    

    然后在你的模板中加载标签

    {% load get_obj from your_module %}
    

    并使用它

    {% get_obj "A_pk" "name" %}
    

    【讨论】:

      【解决方案3】:

      你不能在 Django 中这样做。 From the docs:

      由于 Django 有意限制模板语言中可用的逻辑处理量,因此无法将参数传递给从模板中访问的方法调用。数据应该在视图中计算,然后传递给模板进行显示。

      【讨论】:

        【解决方案4】:

        目前尚不清楚您要完成什么,但您应该弄清楚如何在视图中实现所需的结果并将变量或对象发送到模板。

        【讨论】:

          【解决方案5】:
          1. 在模块内创建名为“templatetags”的文件夹。

          2. 在模板标签中创建“anyname.py”

          anyname.py

          from django import template
          from Clients.models import Client
          register = template.Library()
          @register.filter
          def get_client_name(pk, attr):
              obj = getattr(Client.objects.get(id=pk),attr)
              return obj
          

          现在在模板中添加

          {% load get_client_name from anyname %}
          {{project.Client_id|get_client_name:'Name_of_client' }}
          

          你也可以检查 django documentation on custom tags

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-03
            • 2015-10-31
            • 2010-10-20
            • 1970-01-01
            • 1970-01-01
            • 2011-03-24
            • 1970-01-01
            • 2013-04-12
            相关资源
            最近更新 更多