Wie füge ich URL-Parameter zum URL-Tag der Django-Vorlage hinzu?


100

Meiner Ansicht nach erhalten Sie URL-Parameter wie folgt:

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

In meiner URL versuche ich, Parameter auf diese Weise mit dem URL-Vorlagen-Tag wie folgt zu übergeben:

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

Der Parameter nach dem? funktioniert offensichtlich nicht, wie kann ich diesen Datenwert übergeben, um mit einem get abzurufen?


Überprüfen Sie diesen Link .
Nagkumar Arkalgud


1
Wenn Sie darüber nachdenken, achten Sie darauf, zwischen "Django-URL-Parametern" und "URL-Abfrageparametern" zu unterscheiden. Django-URL-Parameter werden unter urls.pyVerwendung von path()z path('client/<int:id>/'). URL-Abfrageparameter sind der Teil der URL nach dem ?z https://example.com/a/b/?param1=value1&param2=value2. Diese Frage bezieht sich auf URL-Abfrageparameter, aber einige der Antworten beziehen sich auf Django-URL-Parameter.
Christian Long

In dieser Antwort finden Sie ein einfaches benutzerdefiniertes Vorlagen-Tag zum Rendern von URL-Abfragezeichenfolgen.
Christian Long

Antworten:


168

Zuerst müssen Sie Ihre URL vorbereiten, um den Parameter im regulären Ausdruck zu akzeptieren: (urls.py)

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

Sie verwenden dies also in Ihrer Vorlage:

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

Wenn Sie mehr als einen Parameter haben, können Sie Ihren regulären Ausdruck ändern und die Vorlage folgendermaßen ändern:

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

@ MehranNouri verwenden request.GET anstelle von request.get
Cyd

1
Gibt es überhaupt eine dynamische Anzahl von kwargs zu übergeben, indem ein Wörterbuch aus dem Kontext übergeben wird? zB {% url target_link target_kwargs %}wäre es wie das Äquivalent zum Übergeben **kwargsan eine Funktion. Ich habe einen Anwendungsfall, in dem target_linkvariabel ist und daher die Anzahl der kwargs in der URL nicht bekannt ist
teebagz

Beachten Sie, dass dies keine Abfrageparameter sind. Diese Antwort beschreibt Django-URL-Parameter. Dies ist nicht das, wonach das OP gefragt hat (die Antwort beschreibt jedoch eine funktionierende alternative Lösung).
BjörnW

90

Ich habe hier die Antwort gefunden: Ist es möglich, Abfrageparameter über das Vorlagen-Tag {% url%} von Django zu übergeben?

Fügen Sie sie einfach am Ende hinzu:

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

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

[Es gibt nichts anderes zu verbessern, aber ich bekomme einen dummen Fehler, wenn ich die Code-Ticks behebe]


1
Wenn Sie dies verwenden, wird die Information 'office = foobar' für den Benutzer in der Navigationsleiste sichtbar, nicht wahr?
Diansheng

1
Führt dies nicht dazu, dass der abschließende Schrägstrich die URL unterbricht, wie example.com/myview/?office=foobarstatt example.com/myview?office=foobar?
Al Sweigart

2
Sean: Ja. Wenn Sie dies nicht möchten, verwenden Sie eine POST-Anforderung oder suchen Sie einen Rückkanalweg, um die Parameter zu übergeben. Das Übergeben von Parametern an die URL ist Standard für GET-Anfragen
Shayne

Was ist mit zwei Argumenten?
FightWithCode

27

Fügen Sie einfach die URL der Vorlagen hinzu:

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

Wird in Django 2.0 verwendet


@ScottSkiles Sie sollten die Frage dann auf eine bestimmte Version von Django bearbeiten und dann eine weitere hinzufügen, um eine neuere Version abzudecken. Einige würden sagen, dass dies eine Vervielfältigung ist, aber ich bin anderer Meinung. Mehrere Versionen in einer Frage können irreführend sein.
Bernardo Duarte

17

Dies kann in drei einfachen Schritten erfolgen:

1) Artikel-ID mit urlTag hinzufügen:

{% 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) Fügen Sie einen Pfad zu urls.py hinzu :

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

3) Verwenden Sie die ID auf views.py :

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

    return redirect('dashboard')

Geben Sie Ihren Code ein, anstatt einen Screenshot hinzuzufügen, um Abstimmungen zu vermeiden.
Vaibhav Vishal

Genau das, wonach ich in der Django-Dokumentation gesucht habe.
Igor Voltaic

10

Ich bin mir nicht sicher, ob ich nicht im Thema bin, aber ich habe eine Lösung für mich gefunden. Sie haben eine klassenbasierte Ansicht und möchten einen get-Parameter als Vorlagen-Tag haben:

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

Dann stellen Sie Ihre Get-Anfrage /mysite/urlname?get_parameter_name='stuff.

Wenn Sie in Ihre Vorlage einfügen {{ tag_name }}, haben Sie Zugriff auf den Parameterwert get ('stuff'). Wenn Ihre Vorlage eine URL enthält, die diesen Parameter ebenfalls benötigt, können Sie dies tun

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

Sie müssen Ihre URL-Konfiguration nicht ändern


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>

Die {% url 'ticket_details'%} ist der Funktionsname in Ihren Ansichten

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id ist der Parameter, den Sie von ticket_id = ticket.id erhalten

3: URL.py.

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

/? P - wobei ticket_id der Name der Gruppe ist und das Muster mit einem Muster übereinstimmt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.