2

私は 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 at / Variables and attributes may not begin with underscores: 'g._id' が表示されます

view.py で「_id」にアクセスできることを知っているので、誰かが django テンプレートで一意の couchdb の ID にアクセスする方法を説明してもらえますか?おそらく _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"}}

より多くの変数を保存する必要がなく、アクセスするオブジェクトごとに行う必要がないため、DRYer になります。

于 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)

現在、挨拶の各インスタンスには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 に答える