如何从Django模板中的PK中获取对象?

时间:2012-12-13 19:26:14

标签: python django django-templates

在django模板中,我想使用对象的pk获取对象的名称。例如,假设我有来自班级A的pk对象,我想做类似以下的事情:

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

我该怎么做?

5 个答案:

答案 0 :(得分:13)

来自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 }}

答案 1 :(得分:8)

如果您愿意,可以添加自己的标签。像这样:

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" %}

答案 2 :(得分:2)

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

  

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  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