Je travaille sur une vue Django qui permet à l'utilisateur de modifier un objet modèle existant. Cependant, lorsque le formulaire est soumis, il crée un nouvel objet au lieu de modifier l'objet existant.Pourquoi mon formulaire crée-t-il un nouvel objet modèle au lieu de le modifier?
J'ai lu les docs Django sur la fonction save(), les formulaires, les requêtes, etc. mais je n'ai pas été capable de comprendre ce qui se passe. Les docs disent que .save() devrait traduire dans une instruction UPDATE du côté de la base de données. Je pense que le problème est lié à la clé primaire pour ce modèle. Je n'en ai pas défini un manuellement. Le formulaire ne semble pas tirer dans le champ ID que Django a créé automatiquement. Puisque cet ID n'a pas été transmis à .save(), il croit que je veux un nouvel objet (car aucun pk n'a été spécifié).
def modify(request, auditID):
this_audit = get_object_or_404(Audit, id=auditID)
form = auditForm(instance=this_audit)
if form.is_valid():
form.save()
return redirect('index')
Et le modèle:
from django.db import models
class Audit(models.Model):
Inactive = '0'
Completed = '1'
InProgress = '2'
Waiting = '3'
status_choices = (
(Inactive, "This audit is inactive. It may have been cancelled or entered by mistake."),
(Completed, "This audit is completed."),
(InProgress, "This audit is currently in progress."),
(Waiting, "This audit is waiting to be started."),
)
project_number = models.CharField(max_length=10, help_text="This is the audit project number. It should be in the format <b>A-xxx-xxx</b>.")
title = models.CharField(max_length=300, help_text="This is the full audit title.")
title_short = models.CharField(max_length=100, help_text="This is a short title that will be displayed when the long title is inconvenient.")
status = models.CharField(max_length=1, choices = status_choices, default= Waiting, help_text="This is the current status of the audit.")
def __str__(self):
return self.title_short
Postez votre modèle s'il vous plaît. Avez-vous une clé primaire personnalisée? Généralement, vous n'avez pas besoin de définir des champs individuellement, mais utilisez 'form.save()' à la place. – Selcuk
Pourquoi ne validez-vous pas réellement les données dans le formulaire? –
@Selcuk - J'ai ajouté le modèle. À l'origine, j'ai utilisé form.save(), mais l'ai remplacé dans le cadre de mon dépannage. J'ai pensé que j'ai peut-être mal compris comment form.save() fonctionnait. – indigochild