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.