Jak dodać parametry url do tagu url szablonu Django?

102

Moim zdaniem, aby uzyskać takie parametry adresu URL:

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

W moim adresie URL próbuję przekazać parametry w ten sposób za pomocą tagu szablonu adresu URL w następujący sposób:

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

Parametr po znaku? oczywiście nie działa, jak mogę przekazać tę wartość danych w celu pobrania za pomocą get?

Atma
źródło
Sprawdź ten link .
Nagkumar Arkalgud
Możliwy duplikat. Czy można przekazywać parametry zapytania za pomocą tagu szablonu {% url%} Django?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Myśląc o tym, upewnij się, że rozróżniasz „parametry adresu URL Django” i „parametry zapytania adresu URL”. Parametry url Django konfiguruje się urls.pyużywając path()np path('client/<int:id>/'). Parametry zapytania URL to część adresu URL po ?np https://example.com/a/b/?param1=value1&param2=value2. To pytanie dotyczy parametrów zapytania url, ale niektóre odpowiedzi odnoszą się do parametrów url Django.
Christian Long
Zobacz tę odpowiedź, aby uzyskać prosty niestandardowy tag szablonu do renderowania ciągów zapytań adresów URL.
Christian Long

Odpowiedzi:

172

Najpierw musisz przygotować swój adres URL, aby zaakceptował parametr w wyrażeniu regularnym: (urls.py)

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

Więc używasz tego w swoim szablonie:

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

Jeśli masz więcej niż jeden parametr, możesz zmienić swoje wyrażenie regularne i zmodyfikować szablon, wykonując następujące czynności:

{% url 'panel_person_form' person_id=item.id group_id=3 %}
andergmartins
źródło
@MehranNouri używa request.GET zamiast request.get
Cyd,
1
Czy jest w ogóle przekazywanie dynamicznej liczby kwargs przez przekazywanie słownika z kontekstu? np {% url target_link target_kwargs %}. byłoby to odpowiednikiem przejścia **kwargsdo funkcji. Mam przypadek użycia, w którym target_linkjest zmienna, a zatem liczba kwargów w adresie URL nie jest znana
teebagz
Zauważ, że to nie są parametry zapytania, ta odpowiedź opisuje parametry adresu URL django. Nie o to pytał PO (odpowiedź opisuje jednak działające alternatywne rozwiązanie).
BjornW
94

Znalazłem odpowiedź tutaj: Czy możliwe jest przekazywanie parametrów zapytania przez tag szablonu {% url%} Django?

Po prostu dodaj je na końcu:

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

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

[nie ma nic innego do poprawienia, ale otrzymuję głupi błąd, gdy naprawiam znaczniki kodu]

Atma
źródło
1
Jeśli to zrobisz, informacja „office = foobar” będzie widoczna dla użytkownika na pasku nawigacyjnym, prawda?
Diansheng
1
Czy to nie powoduje, że końcowy ukośnik przerywa adres URL, na przykład example.com/myview/?office=foobarzamiast example.com/myview?office=foobar?
Al Sweigart
3
Sean: Tak. Jeśli tego nie chcesz, użyj żądania POST lub znajdź sposób przekazywania parametrów przez kanał zwrotny. Przekazywanie parametrów w adresie URL jest standardem dla żądań GET
Shayne
co za przekazanie dwóch argumentów?
FightWithCode
27

Po prostu dodaj adres URL szablonów:

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

Używany w django 2.0

Panie Singh
źródło
@ScottSkiles Następnie powinieneś edytować pytanie do konkretnej wersji Django, a następnie dodać kolejną, aby objąć nowszą wersję. Niektórzy powiedzieliby, że to kopiowanie, ale ja się nie zgadzam. Wiele wersji w jednym pytaniu może wprowadzać w błąd.
Bernardo Duarte
17

Można to zrobić w trzech prostych krokach:

1) Dodaj identyfikator przedmiotu z urltagiem:

{% 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) Dodaj ścieżkę do urls.py :

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

3) Użyj identyfikatora w views.py :

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

    return redirect('dashboard')
Neeraj Singh Chouhan
źródło
wpisz swój kod zamiast dodawać zrzut ekranu, aby uniknąć głosów przeciw.
Vaibhav Vishal
Dokładnie to, czego szukałem w dokumentacji Django.
Igor Voltaic
10

Nie jestem pewien, czy wyszedłem z tematu, ale znalazłem dla mnie rozwiązanie; Masz widok oparty na klasach i chcesz mieć parametr get jako tag szablonu:

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

Następnie wysyłasz prośbę o pobranie /mysite/urlname?get_parameter_name='stuff.

W swoim szablonie, kiedy wstawisz {{ tag_name }}, będziesz miał dostęp do wartości parametru get („rzeczy”). Jeśli masz w szablonie adres URL, który również wymaga tego parametru, możesz to zrobić

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

Nie będziesz musiał modyfikować konfiguracji adresu URL

Guillaume Lebreton
źródło
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'%} to nazwa funkcji w Twoich widokach

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id to parametr, który otrzymasz z pola ticket_id = ticket.id

3: URL.py

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

/? P - gdzie identyfikator_ biletu to nazwa grupy, a wzorzec to jakiś wzorzec do dopasowania.

Cyd
źródło