¿Cómo agregar parámetros de URL a la etiqueta de URL de la plantilla Django?

100

En mi opinión, para obtener parámetros de URL como este:

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

En mi url estoy tratando de pasar parámetros de esta manera con la etiqueta de plantilla 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>

¿El parámetro después de? obviamente no funciona, ¿cómo puedo pasar este valor de datos para recuperarlo con un get?

Atma
fuente
Consulta este enlace .
Nagkumar Arkalgud
Posible duplicado de ¿Es posible pasar parámetros de consulta a través de la etiqueta de plantilla {% url%} de Django?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Cuando piense en esto, asegúrese de distinguir entre "parámetros de URL de Django" y "parámetros de consulta de URL". Los parámetros de la URL de Django se configuran urls.pyusando path()eg path('client/<int:id>/'). Los parámetros de consulta de URL son la parte de la URL después de ?p https://example.com/a/b/?param1=value1&param2=value2. Ej . Esta pregunta trata sobre los parámetros de consulta de URL, pero algunas de las respuestas se refieren a parámetros de URL de Django.
Christian Long
Consulte esta respuesta para obtener una etiqueta de plantilla personalizada simple para representar cadenas de consulta de URL.
Christian Long

Respuestas:

171

Primero debe preparar su URL para aceptar el parámetro en la expresión regular: (urls.py)

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

Entonces usa esto en su plantilla:

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

Si tiene más de un parámetro, puede cambiar su expresión regular y modificar la plantilla usando lo siguiente:

{% url 'panel_person_form' person_id=item.id group_id=3 %}
andergmartins
fuente
@MehranNouri usa request.GET en lugar de request.get
Cyd
1
¿Hay alguna forma de pasar un número dinámico de kwargs pasando un diccionario desde el contexto? por ejemplo {% url target_link target_kwargs %}, sería como el equivalente a pasar **kwargsa una función. Tengo un caso de uso en el que target_linkes variable y, por lo tanto, no se conoce el número de kwargs en la URL
teebagz
Tenga en cuenta que estos no son parámetros de consulta, esta respuesta describe los parámetros de url de django. Esto no es lo que preguntó el OP (aunque la respuesta describe una solución alternativa de trabajo).
BjornW
93

Encontré la respuesta aquí: ¿Es posible pasar parámetros de consulta a través de la etiqueta de plantilla {% url%} de Django?

Simplemente agréguelos al final:

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

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

[no hay nada más que mejorar, pero recibo un error estúpido cuando corrijo el código]

Atma
fuente
1
Si usa esto, la información 'office = foobar' será visible para el usuario en la barra de navegación, ¿no es así?
Diansheng
1
¿No da como resultado que la barra inclinada final interrumpa la URL, como en example.com/myview/?office=foobarlugar de example.com/myview?office=foobar?
Al Sweigart
3
Sean: Sí. Si no desea esto, utilice una solicitud POST o busque alguna forma de canal de retorno para pasar los parámetros. Pasar parámetros en la URL es estándar para las solicitudes GET
Shayne
lo que pasan dos argumentos?
FightWithCode
27

Simplemente agregue la URL de las plantillas:

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

Utilizado en django 2.0

Sr. Singh
fuente
@ScottSkiles Luego debes editar la pregunta a una versión específica de Django y luego agregar otra para cubrir una versión más reciente. Algunos dirían que es una duplicación, pero no estoy de acuerdo. Varias versiones en una pregunta pueden ser engañosas.
Bernardo Duarte
17

Esto se puede hacer en tres sencillos pasos:

1) Agregue la identificación del artículo con la urletiqueta:

{% 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) Agregar ruta a urls.py :

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

3) Utilice la identificación en views.py :

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

    return redirect('dashboard')
Neeraj Singh Chouhan
fuente
escriba su código en lugar de agregar una captura de pantalla para evitar votos negativos.
Vaibhav Vishal
Exactamente lo que estaba buscando en la documentación de Django.
Igor Voltaic
10

No estoy seguro si estoy fuera del tema, pero encontré una solución para mí; Tiene una vista basada en clases y desea tener un parámetro de obtención como etiqueta de plantilla:

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

Luego haces tu solicitud de obtención /mysite/urlname?get_parameter_name='stuff.

En su plantilla, cuando inserte {{ tag_name }}, tendrá acceso al valor del parámetro get ('cosas'). Si tiene una URL en su plantilla que también necesita este parámetro, puede hacer

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

No tendrás que modificar la configuración de tu URL

Guillaume Lebreton
fuente
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'%} es el nombre de la función en sus vistas

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id es el parámetro que obtendrá de ticket_id = ticket.id

3: URL.py

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

/? P - donde ticket_id es el nombre del grupo y el patrón es un patrón que coincide.

Cyd
fuente