【问题标题】:Accessing couchdb's UUID in django templates在 django 模板中访问 c​​ouchdb 的 UUID
【发布时间】:2011-07-13 08:22:23
【问题描述】:

我对 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

谢谢。

【问题讨论】:

    标签: django couchdbkit


    【解决方案1】:

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

    from django import template
    register = template.Library()
    
    @register.filter(name='get')
    def get(d, k):
        return getattr(d, k)
    

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

    {{object|get:"_id"}}
    

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

    【讨论】:

    【解决方案2】:

    模板错误的原因很简单: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 的值。这是因为 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 %}
    

    【讨论】:

    • 感谢您的工作,虽然会定义。检查如何处理 get_id()。再次非常感谢。
    猜你喜欢
    • 2011-10-04
    • 2012-09-06
    • 2016-01-17
    • 2011-07-10
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多