在django模板中访问couchdb的UUID

时间:2011-07-13 08:22:23

标签: django couchdbkit

我是Couchdb和Django的新手,并且正在尝试扩展使用couchdbkit提供的默认样本(问候语)。使用现有示例制作基本CRUD示例时,我无法在django模板中访问couchdb的文档ID

当我运行这样的东西时

greetings = Greeting.view('greeting/all', descending=False)
for g in greetings:
  print g._id

虽然使用

将其传递给模板,但打印效果很好
return render("home.html", {
  "form": form,
  "greet": greet,
  "greetings": greetings
}, context_instance=RequestContext(request))

使用上面提到的类似循环我可以访问

{% for g in greetings %}
    <tr>
        <td>{{ g.date|timesince }} </td>
        <td>{{ g.author }} </td>
        <td>{{ g.content }}</td>
    </tr>
{% endfor %}

作者和内容,但是当我介绍的时候     {{g._id}}

我在/得到错误TemplateSyntaxError 变量和属性不能以下划线开头:'g._id'

有人可以解释我如何在django模板中访问唯一的couchdb的id,因为我知道我可以在view.py中访问“_id”这对于couchdbkit来说不是问题,关注的是可能在view.py可能会将_id转换为id或其他内容。

如上所述,我是django的新手,因此这个问题本身可能有些愚蠢。

PS:我使用的是coucdb 1.0.2,django 1.3.0和python 2.6

感谢。

2 个答案:

答案 0 :(得分:1)

另一种选择是使用templatetag

访问它
from django import template
register = template.Library()

@register.filter(name='get')
def get(d, k):
    return getattr(d, k)

然后在您的html代码中,您可以使用以下方式访问它:

{{object|get:"_id"}}

它可以节省存储更多变量,并且您不必为要访问它的每个对象执行此操作,这使得DRYer变得更加干净。

答案 1 :(得分:0)

模板错误的原因很简单:Django不允许您访问以下划线开头的对象的属性。我不知道这个的原因,但是按照惯例,以下划线开头的属性在Python中是“私有的”。所以我猜这是由Django强制执行的,迫使开发人员不要做他们糟糕的风格。

首先,您应该确保没有其他方法可以访问ID(例如get_id()或其他内容)。如果没有,您可以解决问题:将_id复制到每个问候语的新属性。

greetings = Greeting.view('greeting/all', descending=False)
for g in greetings:
    setattr(g, 'couchId', g._id)

现在,问候语中的每个实例都有一个新属性couchID,您可以在其中访问_id的值。这项工作是因为Pythons动态特性允许您在运行时修改任何内容 - 您甚至可以创建或删除属性。

在您看来,您可以这么做:

{% for g in greetings %}
<tr>
    <td>{{ g.couchId }} </td>
    <td>{{ g.date|timesince }} </td>
    <td>{{ g.author }} </td>
    <td>{{ g.content }}</td>
</tr>
{% endfor %}