33

私はこのアンカーリンクを持っています:

<a href="/question/tag/1/1/?list_id={{title}}">{{title}}</a>

このタイトルには、「Django + Python」のような + (演算子の追加) を含むコンテンツが含まれることがあります。

ただし、アンカー リンクに直接配置すると、配信される URL は次のようになります。

http://127.0.0.1:8080/question/tag/1/1/?list_id=Django + Python

URL デコーダーが list_id GET = DjangoPython と判断したため、最終的に取得時に問題が発生します。

では、この問題を回避する方法を知っている人はいますか? アンカー リンクを入力ボタンに変更したくないことに注意してください。

4

2 に答える 2

83

それ以外の

{{ title }}

行う

{{title|urlencode}}
于 2013-01-27T13:14:38.237 に答える
-2

URL をハードコーディングし、タイトル コンテキスト アイテムを連結してテンプレートにクエリ文字列を作成する代わりに、django.core.urlresolvers.reverse() を使用し、関連する urls.py ファイルから名前付き URL を指定して、少し単純化することを検討してください。URL の変更を気にする必要がない場合は、すっきりとしたデザインになります。ビュー セットのコンテキスト変数をリバース コールの結果に単に割り当てるのではなく、変更しなければならないすべての散在する HREF の頭痛の種を想像してみてください。クエリ文字列もビューに適切に追加できます。しばしば奇妙なテンプレート解析ルールのいくつかについて心配する必要はありません。urllib.urlencode 関数は、同じ名前のテンプレート フィルターとはまったく異なる動作をすることに注意してください。混乱しないでください!次のように使用できます。

# If the entry in URLConf has named capture groups such as ?<pk>,
# pass a dict as kwargs parameter instead.
url = reverse('your-named-url', args=(1, 1))  # e.g '/question/tag/1/1/'
# Encodes as form data to 'list_id=Django+%2B+Python'
querystring = urllib.urlencode({'list_id': 'Django + Python'})
context['question_url'] = '{}?{}'.format(url, querystring)

次に、テンプレートでは、次のように単純にすることができますhref="{{ question_url }}"。より多くの作業のように見えるかもしれませんが、それは非常に迅速に報われる可能性があり、関心の分離がはるかに優れています. 通常は{% url "your-named-url" %}テンプレート タグを使用しますが、現在はクエリ文字列を適切に処理していません。つまり、URLConf で定義された URL 引数と kwargs を処理するのと同じ方法ではありません。

于 2014-02-06T03:31:28.080 に答える