¿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?


Consulta este enlace .
Nagkumar Arkalgud


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 %}

@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]


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


@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')

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.