DjangoテンプレートのURLタグにURLパラメータを追加するにはどうすればよいですか?


100

私の見解では、このようなURLパラメータを取得します:

date=request.GET.get('date','')

私のURLでは、次のようなurlテンプレートタグを使用して、この方法でパラメーターを渡そうとしています。

<td><a href="{% url 'health:medication-record?date=01/01/2001' action='add' pk=entry.id %}" >Add To Log</a></td>

?の後のパラメータ 明らかに機能していない場合、getで取得するためにこのデータ値をどのように渡すことができますか?




1
これを考えるときは、「Django urlパラメータ」と「urlクエリパラメータ」を区別してください。Django urlパラメータは、たとえばをurls.py使用して設定されます。URLクエリパラメータは、egの後のURLの一部です。この質問はURLクエリパラメータに関するものですが、回答の一部はDjango URLパラメータを参照しています。path()path('client/<int:id>/')?https://example.com/a/b/?param1=value1&param2=value2
クリスチャンロング

URLクエリ文字列をレンダリングする簡単なカスタムテンプレートタグについては、この回答を参照してください。
クリスチャンロング

回答:


170

まず、正規表現でパラメーターを受け入れるようにURLを準備する必要があります:(urls.py)

url(r'^panel/person/(?P<person_id>[0-9]+)$', 'apps.panel.views.person_form', name='panel_person_form'),

したがって、これをテンプレートで使用します。

{% url 'panel_person_form' person_id=item.id %}

パラメータが複数ある場合は、正規表現を変更し、次を使用してテンプレートを変更できます。

{% url 'panel_person_form' person_id=item.id group_id=3 %}

@MehranNouriはrequest.getの代わりにrequest.GETを使用
Cyd

1
とにかく、コンテキストから辞書を渡すことによって動的な数のクワーグを渡すことはありますか?たとえば、関数{% url target_link target_kwargs %}に渡すの**kwargsと同じです。私target_linkは変数があり、そのためurl内のクワーグの数がわからないユースケースがあります
teebagz

これらはクエリパラメータではないことに注意してください。この回答は、django urlパラメータについて説明しています。これはOPが尋ねたものではありません(ただし、答えは有効な代替ソリューションを説明しています)。
BjornW

92

ここで答えを見つけました: Djangoの{%url%}テンプレートタグを介してクエリパラメータを渡すことは可能ですか?

それらを最後に追加するだけです:

<a href="{% url myview %}?office=foobar">
For Django 1.5+

<a href="{% url 'myview' %}?office=foobar">

[他に改善すべきことはありませんが、コードのティックを修正すると、愚かなエラーが発生します]


1
これを使えば、「office = foobar」という情報がナビゲーションバーに表示されますね。
Diansheng 2017

1
これにより、末尾のスラッシュがのようexample.com/myview/?office=foobarにURLを中断するのではないexample.com/myview?office=foobarですか?
Al Sweigart 2017年

2
ショーン:はい。これが不要な場合は、POSTリクエストを使用するか、パラメータを渡すバックチャネルの方法を見つけてください。URLでのパラメーターの受け渡しはGETリクエストの標準です
Shayne

2つの引数を渡すものは何ですか?
FightWithCode 2007

27

テンプレートのURLを追加するだけです。

<a href="{% url 'service_data' d.id %}">
 ...XYZ
</a>

django 2.0で使用


@ScottSkiles次に、質問をDjangoの特定のバージョンに編集し、新しいバージョンを追加して、より新しいバージョンをカバーする必要があります。それは重複していると言う人もいますが、私は同意しません。1つの質問に複数のバージョンがあると誤解を招く可能性があります。
ベルナルドドゥアルテ

17

これは、3つの簡単な手順で実行できます。

1)urlタグ付きのアイテムIDを追加します。

{% for item in post %}
<tr>
  <th>{{ item.id }}</th>
  <td>{{ item.title }}</td>
  <td>{{ item.body }}</td>
  <td>
    <a href={% url 'edit' id=item.id %}>Edit</a>
    <a href={% url 'delete' id=item.id %}>Delete</a>
  </td>
</tr>
{% endfor %}

2)urls.pyにパスを追加します

path('edit/<int:id>', views.edit, name='edit')
path('delete/<int:id>', views.delete, name='delete')

3)views.pyのIDを使用します

def delete(request, id):
    obj = post.objects.get(id=id)
    obj.delete()

    return redirect('dashboard')

反対票を避けるために、スクリーンショットを追加する代わりにコードを入力してください。
Vaibhav Vishal

Djangoのドキュメントで探していた正確なもの。
イゴールVoltaic

10

対象外かどうかはわかりませんが、解決策を見つけました。クラスベースのビューがあり、テンプレートタグとしてgetパラメータを使用したい場合:

class MyView(DetailView):
    model = MyModel

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['tag_name'] = self.request.GET.get('get_parameter_name', None)
        return ctx

次に、getリクエストを行います/mysite/urlname?get_parameter_name='stuff

テンプレートでを挿入{{ tag_name }}すると、getパラメーター値( 'stuff')にアクセスできます。テンプレートにこのパラメーターも必要とするURLがある場合は、次のようにすることができます

 {% url 'my_url' %}?get_parameter_name={{ tag_name }}"

URL構成を変更する必要はありません


5

1:HTML

           <tbody>
            {% for ticket in tickets %}
              <tr>
                <td class="ticket_id">{{ticket.id}}</td>
                <td class="ticket_eam">{{ticket.eam}}</td>
                <td class="ticket_subject">{{ticket.subject}}</td>
                <td>{{ticket.zone}}</td>
                <td>{{ticket.plaza}}</td>
                <td>{{ticket.lane}}</td>
                <td>{{ticket.uptime}}</td>
                <td>{{ticket.downtime}}</td>
                <td><a href="{% url 'ticket_details' ticket_id=ticket.id %}"><button data-toggle="modal" data-target="#modaldemo3" class="value-modal"><i class="icon ion-edit"></a></i></button> <button><i class="fa fa-eye-slash"></i></button>
              </tr>
            {% endfor %}
            </tbody>

{%url 'ticket_details'%}は、ビューの関数名です

2:Views.py

def ticket_details(request, ticket_id):

   print(ticket_id)
   return render(request, ticket.html)

ticket_idは、ticket_id = ticket.idから取得するパラメーターです

3:URL.py

urlpatterns = [
path('ticket_details/?P<int:ticket_id>/', views.ticket_details, name="ticket_details") ]

/?P-ticket_idはグループの名前で、patternは照合するパターンです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.