我是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
感谢。
答案 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 %}