Come aggiungere i parametri dell'URL al tag dell'URL del modello Django?


100

A mio avviso per ottenere parametri URL come questo:

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

Nel mio URL sto cercando di passare i parametri in questo modo con il tag del modello di URL in questo modo:

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

Il parametro dopo il? ovviamente non funziona, come posso passare questo valore di dati per recuperarlo con un get?


Controlla questo collegamento .
Nagkumar Arkalgud


1
Quando pensi a questo, assicurati di distinguere tra "parametri URL Django" e "parametri query URL". I parametri dell'URL di Django sono configurati urls.pyusando path()ad es path('client/<int:id>/'). I parametri di query dell'URL sono la parte dell'URL dopo l' ?es https://example.com/a/b/?param1=value1&param2=value2. Questa domanda riguarda i parametri di query dell'URL, ma alcune delle risposte si riferiscono ai parametri dell'URL di Django.
Christian Long

Vedi questa risposta per un semplice tag modello personalizzato per il rendering delle stringhe di query dell'URL.
Christian Long

Risposte:


171

Per prima cosa devi preparare il tuo URL per accettare il parametro nella regex: (urls.py)

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

Quindi lo usi nel tuo modello:

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

Se hai più di un parametro, puoi cambiare la tua regex e modificare il modello usando quanto segue:

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

@MehranNouri usa request.GET invece di request.get
Cyd

1
Esiste comunque per passare un numero dinamico di kwarg passando un dizionario dal contesto? ad esempio {% url target_link target_kwargs %}, sarebbe come l'equivalente del passaggio **kwargsa una funzione. Ho un caso d'uso in cui target_linkè variabile e quindi il numero di
kwarg nell'URL

Nota che questi non sono parametri di query, questa risposta descrive i parametri dell'URL di django. Questo non è ciò di cui ha chiesto l'OP (la risposta descrive una soluzione alternativa funzionante).
BjornW

93

Ho trovato la risposta qui: è possibile passare i parametri della query tramite il tag template {% url%} di Django?

Aggiungili semplicemente alla fine:

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

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

[non c'è nient'altro da migliorare ma ricevo uno stupido errore quando correggo i segni di graduazione del codice]


1
Se lo usi, l'informazione 'office = foobar' sarà visibile all'utente sulla barra di navigazione, non è vero?
Diansheng,

1
Questo non fa sì che la barra finale interrompa l'URL, come example.com/myview/?office=foobarinvece di example.com/myview?office=foobar?
Al Sweigart

3
Sean: Sì. Se non vuoi questo, usa una richiesta POST, o trova un modo di back-channel per passare i parametri. Il passaggio di parametri sull'URL è standard per le richieste GET
Shayne

cosa passare due argomenti?
FightWithCode

27

Aggiungi semplicemente l'URL dei modelli:

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

Utilizzato in django 2.0


@ScottSkiles Dovresti quindi modificare la domanda su una versione specifica di Django e poi aggiungerne un'altra per coprire una versione più recente. Alcuni direbbero che è un duplicato, ma non sono d'accordo. Più versioni in una domanda potrebbero essere fuorvianti.
Bernardo Duarte,

17

Questo può essere fatto in tre semplici passaggi:

1) Aggiungi ID articolo con urltag:

{% 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) Aggiungi il percorso a urls.py :

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

3) Usa l'ID su views.py :

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

    return redirect('dashboard')

digita il tuo codice invece di aggiungere uno screenshot per evitare voti negativi.
Vaibhav Vishal

Quello che stavo cercando nella documentazione di Django.
Igor Voltaic

10

Non sono sicuro di essere fuori tema, ma ho trovato la soluzione per me; Hai una vista basata sulla classe e vuoi avere un parametro get come tag modello:

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

Quindi fai la tua richiesta di ottenere /mysite/urlname?get_parameter_name='stuff.

Nel tuo modello, quando inserisci {{ tag_name }}, avrai accesso al valore del parametro get ('stuff'). Se hai un URL nel tuo modello che richiede anche questo parametro, puoi farlo

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

Non dovrai modificare la configurazione dell'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'%} è il nome della funzione nelle tue viste

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id è il parametro che otterrai da ticket_id = ticket.id

3: URL.py

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

/? P - dove ticket_id è il nome del gruppo e pattern è un pattern da abbinare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.