2017-10-11 6 views
0

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 
+4

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

+1

Pourquoi ne validez-vous pas réellement les données dans le formulaire? –

+0

@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

Répondre

2

Ce serait mieux, est une meilleure pratique

def modify(request, auditID): 
    this_audit = get_object_or_404(Audit, id=auditID) 

    form = auditForm(request.POST, instance=this_audit) 

    if form.has_changed(): 
     if form.is_valid(): 
      form.save() 

    return redirect('index') 

références https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#the-save-method. Je ne suis pas sûr mais fondamentalement le problème est que vous devez utiliser request.POST

+0

Merci. J'ai édité plus d'informations dans la question. Je pense que le problème provient de l'utilisation du champ ID automatique de Django au lieu de créer une nouvelle clé primaire pour le modèle. – indigochild

+0

@indigochild ce n'est pas le problème –