2

我对 Couchdb 和 Django 有点陌生,并试图扩展 couchdbkit 提供的默认示例(问候语)。在使用现有示例制作基本 CRUD 示例时,我无法在 django 模板中访问 c​​ouchdb 的文档 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

谢谢。

4

2 回答 2

1

另一种选择是使用模板标签访问它

from django import template
register = template.Library()

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

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

{{object|get:"_id"}}

它节省了存储更多变量,您不必为要访问它的每个对象都这样做,这使得它更干燥。

于 2014-10-29T10:46:32.223 回答
0

模板错误的原因很简单:Django 不允许您访问以下划线开头的对象的属性。我不知道其原因,但按照惯例,以下划线开头的属性在 Python 中是“私有的”。所以我想这是 Django 强制要求开发人员不要做他们风格不好的事情。

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

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

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

在您看来,您可以简单地执行以下操作:

{% for g in greetings %}
<tr>
    <td>{{ g.couchId }} </td>
    <td>{{ g.date|timesince }} </td>
    <td>{{ g.author }} </td>
    <td>{{ g.content }}</td>
</tr>
{% endfor %}
于 2011-07-13T09:49:43.020 回答