• 12 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 19/01/2024

Mettez à jour un objet modèle avec un ModelForm

Ajoutez un motif d'URL, une vue et un gabarit pour mettre à jour un groupe

Maintenant qu’on a créé les objets du modèle, on doit être en mesure de les mettre à jour.

Il est temps de choisir un motif d'URL pour notre prochaine vue, qui servira à mettre à jour un groupe existant. Jusqu'à présent, nous avons :

  • « bands/ » pour la liste des groupes ;

  • « bands/1/ » pour le groupe 1, « bands/2/ » pour le groupe 2, etc. ;

  • « bands/add/ » pour créer un groupe.

Pour mettre à jour un groupe, pourquoi ne pas utiliser « bands/change/ » ?

Le problème, c'est qu'il faut aussi savoir quel groupe changer. Mettons aussi cette information dans l'URL.

Ce sera donc « bands/1/change/ » pour mettre à jour le groupe 1, « bands/2/change/ » pour mettre à jour le groupe 2 et ainsi de suite.

Pourquoi pas « bands/change/1/ », avec l'identifiant à la fin de l'URL ?

Ça marcherait aussi ! Lorsque nous choisissons nos chemins, nous pouvons choisir la structure parent-enfant qui nous semble la plus logique. J'aime imaginer que la page de modification est un « enfant » de la page détaillée du groupe. Ainsi, si la page détaillée se trouve à l'adresse « bands/1/ », je place la page des modifications pour ce groupe à l'adresse « bands/1/change/ ».

Vous devriez maintenant connaître la marche à suivre, alors allez-y et ajoutez un nouveau modèle d'URL, une nouvelle vue et un gabarit de base (le formulaire n’est pas encore nécessaire) pour la mise à jour d'un groupe.

Réutilisez un ModelForm pour les opérations de mise à jour

Ce qui est bien avec les formulaires dans Django, c'est qu'il n'est pas nécessaire d'en créer un nouveau spécifiquement pour l'opération de mise à jour : nous pouvons réutiliser le formulaire que nous utilisons déjà pour l'opération de création. Après tout, nous ne faisons que mettre à jour les mêmes champs que ceux avec lesquels nous avons travaillé précédemment.

La différence est que lorsque nous chargeons la vue pour la première fois, plutôt que de générer un formulaire vide, nous voulons préremplir le formulaire avec les valeurs existantes de l'objet que nous modifions. Nous faisons cela en passant l'objet au mot-clé instance, par exemple BandForm(instance=band). Faisons cela dans la vue :

# listings/views.py

        def band_update(request, id):
            band = Band.objects.get(id=id)
            form = BandForm(instance=band)  # on pré-remplir le formulaire avec un groupe existant
            return render(request,
                            'listings/band_update.html',
                            {'form': form})

Ensuite, nous générons le formulaire dans le modèle :

# listings/templates/listings/band_update.html

...
  <h1>Mise à jour du groupe</h1>

  <form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Envoyer">
 </form>
...

 ... notre formulaire est maintenant prérempli, par exemple, voir http://127.0.0.1:8000/bands/1/change/ :

Les champs de la page « Mettre à jour un groupe » sont remplis.
Notre formulaire est pré-rempli.

Maintenant, nous devons modifier la vue pour mettre à jour notre objet avec les valeurs que nous renvoyons en POST au serveur. Comme pour nos traitements précédents des formulaires POST, nous devons gérer les scénarios GET et POST dans la vue :

def band_update(request, id):
    band = Band.objects.get(id=id)

    if request.method == 'POST':
        form = BandForm(request.POST, instance=band)
        if form.is_valid():
            # mettre à jour le groupe existant dans la base de données
            form.save()
            # rediriger vers la page détaillée du groupe que nous venons de mettre à jour
            return redirect('band-detail', band.id))
    else:
        form = BandForm(instance=band)

    return render(request,
                'listings/band_update.html',
                {'form': form})

Après avoir mis à jour le groupe avec les valeurs soumises, nous redirigeons vers la page détaillée du groupe.

Créez un lien vers la page de mise à jour

Il existe deux endroits à partir desquels nous pourrions créer un lien vers une page de « mise à jour » du groupe. Mettons en œuvre les deux possibilités.

Tout d'abord, nous pouvons établir un lien à partir de la vue en liste Band :

# listings/templates/listings/band_list.html

...
  <ul>
    {% for band in bands %}
      <li>
        <a href="{% url 'band-detail' band.id %}">{{ band.name }}</a>
        - <a href="{% url 'band-update' band.id %}">[modifier]</a>
      </li>
    {% endfor %}
  </ul>
...
À côté de chaque bande se trouve l'option « Éditer ».
Ajout de liens « Éditer ».

Deuxièmement, nous pouvons établir un lien à partir de la vue détaillée du groupe :

# listings/templates/listings/band_detail.html

...
  <p>{{ band.biography }}</p>

  <a href="{% url 'band-update' band.id %}">Modifier ce groupe</a>

  <a href="{% url 'band-list' %}">Retourner à la liste des groupes</a>
...
En bas de la page de détail se trouve l'option « Retourner à la liste des groupes ».
L'option « Retourner à la liste des groupes » est ajoutée.

Maintenant que vous avez terminé ce chapitre, consultez le screencast pour vous remémorer toutes les étapes que vous avez vues.

C'est à vous ! Réutilisez le ModelForm de Listing dans une page de mise à jour des annonces

Pour cet exercice, vous devez : 

  • ajouter une page de « Mise à jour des annonces » (modèle d'URL, vue et gabarit) ;

  • utiliser le ListingForm existant dans cette page pour mettre à jour les objets ;

  • lier les pages de liste des annonces et de détails d’une annonce vers la page de mise à jour.

En résumé

  • Lorsqu'il s'agit de mettre à jour des objets, vous pouvez souvent réutiliser le ModelForm que vous utilisez lors de la création des objets.

  • La grande différence, c’est que lorsque vous instanciez le formulaire, vous passez l’objet que vous voulez pour effectuer une mise à jour avec le mot clé instance, par exemple :   form = BandForm(instance=band).

Maintenant que nous avons couvert la création et la mise à jour d'objets, il reste une opération d'écriture à couvrir, le « D » de « CRUD » : Delete, la suppression.

Exemple de certificat de réussite
Exemple de certificat de réussite