Comment ajouter des paramètres d'URL à la balise URL du modèle Django?

100

À mon avis, pour obtenir des paramètres d'URL comme celui-ci:

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

Dans mon URL, j'essaie de transmettre des paramètres de cette manière avec la balise de modèle d'url comme celle-ci:

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

Le paramètre après le? ne fonctionne évidemment pas, comment puis-je transmettre cette valeur de données afin de récupérer avec un get?

Atma
la source
Vérifiez ce lien .
Nagkumar Arkalgud
Possible duplication de Est-il possible de passer des paramètres de requête via la balise template {% url%} de Django?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
En réfléchissant à cela, assurez-vous de faire la distinction entre les "paramètres d'url Django" et les "paramètres de requête d'url". Les paramètres d'url de Django sont configurés en urls.pyutilisant path()par exemple path('client/<int:id>/'). Les paramètres de requête d'URL font partie de l'URL après le ?par exemple https://example.com/a/b/?param1=value1&param2=value2. Cette question concerne les paramètres de requête d'url, mais certaines des réponses se réfèrent aux paramètres d'url de Django.
Christian Long
Consultez cette réponse pour une balise de modèle personnalisée simple pour afficher les chaînes de requête d'URL.
Christian Long

Réponses:

171

Vous devez d'abord préparer votre URL pour accepter le paramètre dans l'expression régulière: (urls.py)

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

Vous utilisez donc ceci dans votre modèle:

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

Si vous avez plus d'un paramètre, vous pouvez changer votre expression régulière et modifier le modèle en utilisant ce qui suit:

{% url 'panel_person_form' person_id=item.id group_id=3 %}
andergmartins
la source
@MehranNouri utilise request.GET au lieu de request.get
Cyd
1
Est-il possible de passer un nombre dynamique de kwargs en passant un dictionnaire à partir du contexte? par exemple, {% url target_link target_kwargs %}ce serait comme l'équivalent du passage **kwargsà une fonction. J'ai un cas d'utilisation où target_linkest variable et donc le nombre de kwargs dans l'url n'est pas connu
teebagz
Notez que ce ne sont pas des paramètres de requête, cette réponse décrit les paramètres d'URL de django. Ce n'est pas ce que le PO a demandé (la réponse décrit cependant une solution alternative fonctionnelle).
BjornW
93

J'ai trouvé la réponse ici: est-il possible de passer des paramètres de requête via la balise de modèle {% url%} de Django?

Ajoutez-les simplement à la fin:

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

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

[il n'y a rien d'autre à améliorer mais j'obtiens une erreur stupide lorsque je corrige les graduations du code]

Atma
la source
1
Si vous l'utilisez, les informations 'office = foobar' seront visibles par l'utilisateur dans la barre de navigation, n'est-ce pas?
Diansheng
1
Cela ne signifie-t-il pas que la barre oblique de fin interrompt l'url, comme example.com/myview/?office=foobarau lieu de example.com/myview?office=foobar?
Al Sweigart
3
Sean: Oui. Si vous ne le souhaitez pas, utilisez une requête POST ou trouvez un moyen de retour de canal pour passer les paramètres. La transmission de paramètres sur l'URL est standard pour les requêtes GET
Shayne
que passer deux arguments?
FightWithCode
27

Ajoutez simplement l'URL des modèles:

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

Utilisé dans django 2.0

Monsieur Singh
la source
@ScottSkiles Vous devez ensuite modifier la question dans une version spécifique de Django, puis en ajouter une autre pour couvrir une version plus récente. Certains diraient que c'est une duplication, mais je ne suis pas d'accord. Plusieurs versions dans une question peuvent être trompeuses.
Bernardo Duarte le
17

Cela peut être fait en trois étapes simples:

1) Ajouter l'ID d'article avec l' urlétiquette:

{% 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) Ajoutez le chemin vers urls.py :

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

3) Utilisez l'identifiant sur views.py :

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

    return redirect('dashboard')
Neeraj Singh Chouhan
la source
tapez votre code au lieu d'ajouter une capture d'écran pour éviter les votes négatifs.
Vaibhav Vishal le
Ce que je recherchais exactement dans la documentation Django.
Igor Voltaic
10

Je ne sais pas si je suis hors du sujet, mais j'ai trouvé une solution pour moi; Vous avez une vue basée sur une classe et vous souhaitez avoir un paramètre get comme balise de modèle:

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

Ensuite, vous faites votre demande d'obtention /mysite/urlname?get_parameter_name='stuff.

Dans votre modèle, lors de l'insertion {{ tag_name }}, vous aurez accès à la valeur du paramètre get ('stuff'). Si vous avez une URL dans votre modèle qui nécessite également ce paramètre, vous pouvez faire

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

Vous n'aurez pas à modifier la configuration de votre URL

Guillaume Lebreton
la source
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'%} est le nom de la fonction dans vos vues

2: Views.py

def ticket_details(request, ticket_id):

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

ticket_id est le paramètre que vous obtiendrez à partir de ticket_id = ticket.id

3: URL.py

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

/? P - où ticket_id est le nom du groupe et pattern est un pattern à faire correspondre.

Cyd
la source