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?


Sprawdź ten link .
Nagkumar Arkalgud


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 %}

@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]


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


@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')

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.