Bagaimana menambahkan parameter url ke tag url template Django?


102

Dalam pandangan saya untuk mendapatkan parameter url seperti ini:

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

Di url saya, saya mencoba meneruskan parameter dengan cara ini dengan tag template url seperti ini:

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

Parameter setelah? jelas tidak berfungsi, bagaimana saya bisa meneruskan nilai data ini untuk mengambilnya dengan get?




1
Ketika memikirkan tentang ini, pastikan untuk membedakan antara "parameter url Django" dan "parameter kueri url". Parameter url Django dikonfigurasikan dalam urls.pymenggunakan path()mis path('client/<int:id>/'). Parameter kueri URL adalah bagian dari url setelah ?mis https://example.com/a/b/?param1=value1&param2=value2. Pertanyaan ini tentang parameter kueri url, tetapi beberapa jawaban merujuk ke parameter url Django.
Christian Long

Lihat jawaban ini untuk tag template kustom sederhana untuk merender string kueri url.
Christian Long

Jawaban:


172

Pertama, Anda perlu menyiapkan url untuk menerima parameter di regex: (urls.py)

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

Jadi Anda menggunakan ini di template Anda:

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

Jika Anda memiliki lebih dari satu param, Anda dapat mengubah ekspresi reguler dan memodifikasi template menggunakan yang berikut ini:

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

@Mehranor menggunakan request.GET sebagai ganti request.get
Cyd

1
Apakah ada cara untuk melewatkan sejumlah kwarg dinamis dengan melewatkan kamus dari konteks? misalnya, {% url target_link target_kwargs %}ini akan seperti padanan dengan meneruskan **kwargske suatu fungsi. Saya memiliki kasus penggunaan di mana target_linkadalah variabel dan oleh karena itu jumlah kwarg di url tidak diketahui
teebagz

Perhatikan bahwa ini bukan parameter kueri, jawaban ini menjelaskan parameter url django. Ini bukan yang OP bertanya tentang (meskipun jawabannya menggambarkan solusi alternatif yang berfungsi).
BjornW

94

Saya menemukan jawabannya di sini: Apakah mungkin untuk melewatkan parameter kueri melalui tag cetakan {% url%} Django?

Cukup tambahkan ke bagian akhir:

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

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

[tidak ada lagi yang perlu diperbaiki, tetapi saya mendapatkan kesalahan yang bodoh saat saya memperbaiki kodenya]


1
Jika menggunakan ini, informasi 'office = foobar' akan terlihat oleh pengguna di bilah navigasi, bukan?
Diansheng

1
Bukankah ini mengakibatkan garis miring menginterupsi url, seperti example.com/myview/?office=foobarbukan example.com/myview?office=foobar?
Al Sweigart

3
Sean: Ya. Jika Anda tidak menginginkan ini, gunakan permintaan POST, atau temukan beberapa cara saluran belakang untuk meneruskan params. Meneruskan parameter pada URL adalah standar untuk permintaan GET
Shayne

apa yang melewati dua argumen?
FightWithCode

28

Cukup tambahkan URL Template:

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

Digunakan dalam django 2.0


@ScottSkiles Anda kemudian harus mengedit pertanyaan ke versi tertentu dari Django dan kemudian menambahkan satu lagi untuk mencakup versi yang lebih baru. Beberapa orang akan mengatakan itu duplikat, tapi saya tidak setuju. Beberapa versi dalam satu pertanyaan mungkin menyesatkan.
Bernardo Duarte

17

Ini dapat dilakukan dalam tiga langkah sederhana:

1) Tambahkan id item dengan urltag:

{% 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) Tambahkan jalur ke urls.py :

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

3) Gunakan id di views.py :

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

    return redirect('dashboard')

ketik kode Anda alih-alih menambahkan tangkapan layar untuk menghindari suara negatif.
Vaibhav Vishal

Hal yang persis saya cari dalam dokumentasi Django.
Igor Voltaic

10

Saya tidak yakin apakah saya keluar dari subjek, tetapi saya menemukan solusi untuk saya; Anda memiliki tampilan berbasis kelas, dan Anda ingin memiliki parameter get sebagai tag template:

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

Kemudian Anda membuat permintaan get Anda /mysite/urlname?get_parameter_name='stuff.

Di template Anda, saat Anda memasukkan {{ tag_name }}, Anda akan memiliki akses ke nilai parameter get ('stuff'). Jika Anda memiliki url di template Anda yang juga membutuhkan parameter ini, Anda bisa melakukannya

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

Anda tidak perlu mengubah konfigurasi url Anda


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'%} adalah nama fungsi dalam tampilan Anda

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id adalah parameter yang akan Anda dapatkan dari ticket_id = ticket.id

3: URL.py

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

/? P - di mana ticket_id adalah nama grup dan pola adalah beberapa pola untuk dicocokkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.