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.