Utilisation d'un paramètre d'URL avec Django : cas concret

11 octobre 2023

image_8.max-220x220


En travaillant sur un projet Django, j'ai été confronté à un problème que j'ai pu résoudre en utilisant un paramètre d'URL que j'ai récupéré dans une vue.


Qu'est-ce qu'un paramètre d'URL ?

Un paramètre d'URL est une partie spécifique d'une URL de site Web qui a pour but de fournir des informations supplémentaires. Pensez-y comme un ajout à une instruction de base pour fournir plus de détails.

Par exemple, sur un site de shopping en ligne, l'URL pourrait être "www.boutique.com/vetements". Mais il manque quelque chose - quel type de vêtements cherchez-vous ? C'est là qu'interviennent les paramètres d'URL pour préciser votre demande. Si vous cherchez des chapeaux, par exemple, l'URL pourrait devenir "www.boutique.com/vetements?type=chapeau". Dans cet exemple, "type=chapeau" est le paramètre d'URL.

C'est un concept utilisé pour personnaliser l'interaction entre l'utilisateur et un site Web.

Utilisations des paramètres d'URL

Les paramètres d'URL sont utilisés dans les applications web pour de multiples raisons :

  • Comme nous l'avons vu ci-dessus, ils permettent de créer des URLS dynamiques basées sur des actions ou données spécifiques fournies par l'utilisateur.
  • Ils sont aussi utilisés pour le suivi. Par exemple, un paramètre d'URL pourrait être utilisé pour suivre l'origine du trafic web en montrant quel lien a amené l'utilisateur sur une certaine page.
  • Pour mon cas, j'ai eu besoin d'utiliser un paramètre d'URL pour mémoriser où l'utilisateur était dans l'application lorsqu'il clique sur un lien.

Problème rencontré

Je travaille actuellement sur un projet Django un peu particulier. Il s'agit d'une application web qui contiendra plusieurs histoires. Il sera possible de sélectionner un personnage et d'être actif quant au déroulement de l'histoire. En effet, l'histoire sera différente selon vos choix.

Le personnage choisi dispose d'un inventaire avec différents objets : armes et consommables.

C'est là que nous arrivons dans le cœur du sujet : Il est possible de prendre une potion hors combat et en combat. Mais la vue qui gère l'action de prendre un consommable renvoie toujours dans une zone hors combat. Très gênant lorsque vous prenez une potion et que vous vous retrouvez hors de la zone de combat en un clique...

L'idée est donc d'utiliser un paramètre d'URL pour revenir à mon "point de départ".

inventaire.width-800

Méthode GET

Ici nous allons transmettre notre point de départ dans l'URL.

J'ai deux vues différentes dans lesquelles il est possible d'utiliser une potion par exemple :

  1. Hors combat : branch
  2. En combat : arena

Lorsque je prends un consommable comme une potion je fais appel à la vue get_item_view nommée rpg:get-item dans mon fichier urls.py.

Donc si je transmets l'information à l'url depuis la zone branch :

<a href="{% url 'rpg:get-item' %}?redirect=branch">Ma potion</a>

Et depuis la zone arena :

<a href="{% url 'rpg:get-item' %}?redirect=arena">Ma potion</a>

Et dans ma vue je récupère l'information avec request.GET.get("redirect") :

def get_item_view(request, pk, story_id):
    # Traitement des données dans la vue puis : 
    redirection = request.GET.get("redirect")
    if redirection == "arena":
        return redirect("rpg:arena", pk=game_character.pk, story_id=story.story_id)

    elif redirection == "branch":
        return redirect("rpg:branch", pk=game_character.pk, story_id=story.story_id)

        # On est bien redirigé vers notre point de départ

Mais si je veux passer par une méthode POST ?!

Et oui... Ici je me suis rendu compte que la méthode GET ne me convenait pas. J'accède à ma vue uniquement avec une méthode POST.

Donc dans mon HTML :

<form method="post" action="{% url 'rpg:get-item' item.pk story.story_id %}">
    {% csrf_token %}
    <input type="hidden" name="redirect" value="arena">
    <input type="image" src="{{ item.illustration.illustration.url }}" class="rounded"
           width="75"
           height="auto" alt="image bouton">
</form>

Ici, j'inclus un input caché avec name="redirect" et value="arena".

De ce fait, dans ma vue je peux récupérer la valeur de mon input :

@require_POST
def get_item_view(request, pk, story_id):
    redirection = request.POST.get("redirect")
    if redirection == "arena":
        return redirect("rpg:arena", pk=game_character.pk, story_id=story.story_id)

Retour