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/ :
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>
...
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>
...
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.