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?

Atma
fonte
Verifique este link .
Nagkumar Arkalgud
Possível duplicata de É possível passar parâmetros de consulta por meio da tag de modelo {% url%} do Django?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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 %}
andergmartins
fonte
@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]

Atma
fonte
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

Sr. Singh
fonte
@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')
Neeraj Singh Chouhan
fonte
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

Guillaume Lebreton
fonte
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.

Cyd
fonte