2

フィルタに渡して URL を取得したい値がいくつかあります。

私のテンプレートには次のものがあります。

{% if names %}
  {% for name in names %}
    <a href='{{name|slugify|add_args:"custid=name.id, sortid=2"}}'>{{name}}</a>
    {%if not forloop.last %} | {% endif %}
  {% endfor %}
{% endif %}

私のテンプレートタグには次のものがあります:

@register.filter
def add_args(value, args):
    argz = value.strip() + '-' + 'ARGS'
    arglist = args.split(',')
    for arg in arglist:
        keyval = arg.split('=')
        argz.join(keyval[0] + 'ZZ' + keyval[1])
        argz.join('QQ')

    return argz  

出力 URL は次のようになります。

http://foo.org/john-smith-ARGScustidZZ11QQsortidZZ2

ARGS は引数の先頭、ZZ は「=」、QQ は「&」に相当します。

まず第一に:これはうまくいきますが、私は custid=name.id を add_args() に入れます. custid=11 を入れたいのですが、id をテキストではなく id として渡す方法.

また、PHP のように key=>value の配列を送信する方法はありますか。PHPでは、配列を作成します。たとえば、次のようにします。

arglist = array('custid' => $nameid, 'sortid' => $sortid ); 

add_args()次に、arglist を引数として渡しadd_args()ます。

foreach( arglist as $key => $value)
  $argstr .= $key . 'ZZ' . $value . 'QQ'.

誰かがこれを機能させるためのより良い方法を持っていますか?

注: すべての引数を文字列として渡し、それらをフィルターで分割する必要がある場合は、気にしません。name.id をその値として渡す方法がわかりません...

4

3 に答える 3

6

この「スマート」なもののロジックは、テンプレートに含めるべきではありません。ビューでURLの終わりを作成し、それらをテンプレートに渡します。

def the_view(request):
  url_stuff = "custid=%s, sortid, ...." % (name.id, 2 ...)

  return render_to_response('template.html',
    {'url_stuff':url_stuff,},
    context_instance = RequestContext(request))

template.html:

 ....

    <a href='{{url_stuff}}'>{{name}}</a>

 ....

多数のオブジェクトのURLが必要な場合は、モデルでget_absolute_urlを使用することを検討してください。

于 2009-05-26T17:08:24.873 に答える
4

name.idフィルタに渡すことはできません。フィルタ引数は、単一の値または単一のリテラルにすることができます。Python / Djangoは、PHPのような「スマートな」変数置換を試みません。

このタスクのタグを作成することをお勧めします。

<a href='{% add_args "custid" name.id "sortid" "2" %}{{name|slugify}}{% end_add_args %}'>{{name}}</a>

このようにして、どの引数がリテラル値であり、コンテキストなどから取得する必要があるかを知ることができます。ドキュメントはこれについて非常に明確です。を見てください。

また、これnameがモデルに関連している場合、たとえばパーマリンクにアクセスしたい場合は、適切な引数を使用してURLを返すメソッドを追加するのが最も適切な解決策になる可能性があります。

全体として、テンプレートにあまり多くのロジックを入れることは控えます。DjangoはPHPではありません。

于 2009-05-22T07:47:51.870 に答える
3

You're calling argz.join a couple times and never assigning the results to anything: maybe you're operating under the misconception that the join method of a string has some mysterious side effect, but it doesn't -- it just returns a new string, and if you don't do anything with that new string, poof, it's gone. Is that at least part of your problem...?

于 2009-05-22T04:08:59.220 に答える