Django şablon url etiketine url parametreleri nasıl eklenir?


111

Benim görüşüme göre, bunun gibi url parametreleri almak için:

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

URL'mde parametreleri şu şekilde url şablon etiketi ile bu şekilde aktarmaya çalışıyorum:

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

? 'Den sonraki parametre açıkçası çalışmıyor, bir get ile geri almak için bu veri değerini nasıl iletebilirim?


Bu bağlantıyı kontrol edin .
Nagkumar Arkalgud


1
Bunu düşünürken, "Django url parametreleri" ve "url sorgu parametreleri" arasında ayrım yaptığınızdan emin olun. Django url parametreleri yapılandırılır urls.pykullanarak path()örneğin path('client/<int:id>/'). URL sorgu parametreleri, URL'nin ?örn https://example.com/a/b/?param1=value1&param2=value2. Bu soru url sorgu parametreleri hakkındadır, ancak bazı yanıtlar Django url parametrelerine atıfta bulunur.
Christian Long

URL sorgu dizelerini işlemek için basit bir özel şablon etiketi için bu yanıta bakın .
Christian Long

Yanıtlar:


177

Öncelikle, normal ifadede paramı kabul etmek için url'nizi hazırlamanız gerekir: (urls.py)

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

Yani bunu şablonunuzda kullanırsınız:

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

Birden fazla parametreniz varsa, aşağıdakileri kullanarak normal ifadenizi değiştirebilir ve şablonu değiştirebilirsiniz:

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

@MehranNouri, request.get yerine request.GET kullanın
Cyd

1
Bağlamdan bir sözlük geçirerek dinamik sayıda kwarg geçirmenin bir yolu var mı? örneğin bir işleve {% url target_link target_kwargs %}geçmeye eşdeğerdir **kwargs. target_linkDeğişken olduğu ve bu nedenle url'deki kwarg sayısının bilinmediği bir kullanım durumum var
teebagz

2
Bunların sorgu parametreleri olmadığını unutmayın, bu yanıt django url parametrelerini açıklamaktadır. Bu, OP'nin sorduğu şey değildir (cevap, çalışan bir alternatif çözümü tanımlamaktadır).
BjornW

96

Cevabı burada buldum: Sorgu parametrelerini Django'nun {% url%} şablon etiketiyle geçirmek mümkün mü?

Bunları sonuna ekleyin:

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

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

[iyileştirecek başka bir şey yok ama kod tiklerini düzelttiğimde aptalca bir hata alıyorum]


1
Bunu kullanırsanız, 'office = foobar' bilgisi kullanıcı tarafından gezinme çubuğunda görülebilir, değil mi?
Diansheng

1
Gibi, url kesintiye eğik çizgiyle değil bu sonucu mu example.com/myview/?office=foobaryerine example.com/myview?office=foobar?
Al Sweigart

3
Sean: Evet. Bunu istemiyorsanız, bir POST isteği kullanın veya parametreleri geçmek için bir arka kanal yolu bulun. URL'de parametrelerin aktarılması GET istekleri için standarttır
Shayne

iki argüman ne geçiyor?
FightWithCode

29

Şablon URL'si eklemeniz yeterlidir:

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

Django 2.0'da kullanıldı


@ScottSkiles Daha sonra soruyu Django'nun belirli bir sürümüne düzenlemeli ve daha yeni bir sürümü kapsayacak şekilde başka bir tane eklemelisiniz. Bazıları bunun bir kopya olduğunu söyleyebilir, ama ben katılmıyorum. Bir sorunun birden çok versiyonu yanıltıcı olabilir.
Bernardo Duarte

21

Bu, üç basit adımda yapılabilir:

1) Etiketli ürün kimliği ekleyin url:

{% 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'ye yol ekleyin :

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

3) views.py'de kimliği kullanın :

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

    return redirect('dashboard')

Olumsuz oyları önlemek için ekran görüntüsü eklemek yerine kodunuzu yazın.
Vaibhav Vishal

Django belgelerinde tam aradığım şey.
Igor Volta

Href'iniz için çift tırnak eklemeniz gerektiğini düşünüyorum.
Behrouz Beheshti

10

Konunun dışında mıyım emin değilim ama kendime bir çözüm buldum; Sınıf tabanlı bir görünümünüz var ve şablon etiketi olarak bir get parametresine sahip olmak istiyorsunuz:

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

Sonra alma isteğinizi yaparsınız /mysite/urlname?get_parameter_name='stuff.

Şablonunuzda, eklediğinizde {{ tag_name }}, get parametre değerine ('malzeme') erişiminiz olacaktır. Şablonunuzda bu parametreye de ihtiyaç duyan bir url varsa, şunları yapabilirsiniz:

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

URL yapılandırmanızı değiştirmeniz gerekmeyecek


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'%}, görünümlerinizdeki işlev adıdır

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id, ticket_id = ticket.id adresinden alacağınız parametredir

3: URL.py

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

/? P - burada ticket_id grubun adıdır ve kalıp eşleşecek bir kalıptır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.