Como adicionar parâmetros de url à tag de url do template do Django?


100

Na minha opinião, obter parâmetros de url como este:

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

No meu url, estou tentando passar parâmetros desta forma com a tag de modelo de url como esta:

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

O parâmetro após o? obviamente não está funcionando, como posso passar esse valor de dados para recuperá-lo com um get?


Verifique este link .
— Nagkumar Arkalgud


1
Ao pensar sobre isso, certifique-se de distinguir entre "parâmetros de url do Django" e "parâmetros de consulta de url". Os parâmetros de url do Django são configurados urls.pyusando, path()por exemplo path('client/<int:id>/'). Os parâmetros de consulta de URL fazem parte do url após o ?ex https://example.com/a/b/?param1=value1&param2=value2. Esta pergunta é sobre parâmetros de consulta de url, mas algumas das respostas se referem aos parâmetros de url do Django.
— Christian Long

Veja esta resposta para uma tag de template customizada simples para renderizar strings de consulta de url.
— Christian Long

Respostas:


170

Primeiro, você precisa preparar seu url para aceitar o parâmetro no regex: (urls.py)

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

Então, você usa isso em seu modelo:

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

Se você tiver mais de um parâmetro, poderá alterar sua regex e modificar o modelo usando o seguinte:

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

@MehranNouri use request.GET em vez de request.get
— Cyd

1
Existe alguma maneira de passar um número dinâmico de kwargs passando um dicionário do contexto? por exemplo {% url target_link target_kwargs %}, seria o equivalente a passar **kwargspara uma função. Eu tenho um caso de uso em que target_linké variável e, portanto, o número de kwargs no url não é conhecido
— teebagz

Observe que esses não são parâmetros de consulta, esta resposta descreve os parâmetros de url do django. Não foi isso que o OP perguntou (a resposta descreve uma solução alternativa funcional).
— BjornW

93

Encontrei a resposta aqui: É possível passar parâmetros de consulta por meio da tag de modelo {% url%} do Django?

Basta adicioná-los ao final:

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

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

[não há mais nada a melhorar, mas estou recebendo um erro estúpido quando corrijo os ticks do código]


1
Se usar isto, a informação 'office = foobar' ficará visível para o usuário na barra de navegação, não é?
— Diansheng

1
Isso não resulta na barra final interrompendo o url, como em example.com/myview/?office=foobarvez de example.com/myview?office=foobar?
— Al Sweigart

3
Sean: Sim. Se você não quiser isso, use uma solicitação POST ou encontre alguma forma de canal secundário para passar os parâmetros. Passar parâmetros no URL é padrão para solicitações GET
— Shayne

o que passando dois argumentos?
— FightWithCode

27

Basta adicionar o URL dos modelos:

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

Usado no Django 2.0


@ScottSkiles Você deve então editar a questão para uma versão específica do Django e então adicionar outra para cobrir uma versão mais recente. Alguns diriam que é uma duplicação, mas eu discordo. Várias versões em uma pergunta podem ser enganosas.
— Bernardo Duarte

17

Isso pode ser feito em três etapas simples:

1) Adicionar id do item com 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) Adicione o caminho para urls.py :

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

3) Use o id em views.py :

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

    return redirect('dashboard')

digite seu código em vez de adicionar uma captura de tela para evitar votos negativos.
— Vaibhav Vishal

A coisa exata que eu estava procurando na documentação do Django.
— Igor Voltaic

10

Não tenho certeza se estou fora do assunto, mas encontrei solução para mim; Você tem uma visão baseada em classe e deseja ter um parâmetro get como uma tag de modelo:

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

Então você faz seu pedido get /mysite/urlname?get_parameter_name='stuff.

No seu modelo, ao inserir {{ tag_name }}, você terá acesso ao valor do parâmetro get ('stuff'). Se você tem um url em seu modelo que também precisa deste parâmetro, você pode fazer

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

Você não terá que modificar sua configuração de 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>

O {% url 'ticket_details'%} é o nome da função em suas visualizações

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id é o parâmetro que você obterá de ticket_id = ticket.id

3: URL.py

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

/? P - onde ticket_id é o nome do grupo e o padrão é algum padrão para corresponder.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.