2010-11-12 11 views
3

Comment puis-je mettre à jour un enregistrement existant plutôt que d'en ajouter un nouveau qui est mon problème. En ce moment j'essaye d'éditer des données de produit existantes dans le formulaire d'édition et sauve les nouveaux changements. Mais au lieu de mettre à jour les données produit existantes, j'obtiens un nouveau produit, donc tout est dupliqué. Un nouveau produit est créé au lieu de mettre à jour ses données existantes. Que puis-je faire pour résoudre ce problème?Django Modifier les données de formulaire: les données sont dupliquées au lieu d'être mises à jour

Voici mon code:

@login_required 
def edit(request, id=None): 
if request.method == 'POST': 
    form = ProductForm(request.POST) 

    if form.is_valid(): 
     product = form.save(commit=False) 
     product.save() 

     return HttpResponseRedirect('/details/%s/' % (product.id)) 

Eternicode, je vous remercie pour la grande réponse, le code fonctionne bien maintenant et les données ne sont pas dupliquées en épargnant la forme après la date de modification. Sur la base de votre réponse, voici ce qui fonctionne:

@login_required 
def edit(request, id=None): 

if request.method == 'POST': 
    product = Product.objects.get(id__exact=id) 
    form = ProductForm(request.POST, instance=product) 

    print "PRODUCT POST" 

    if form.is_valid(): 
     print "Display Form" 

     product = form.save(commit=False) 
     product.save() 

     return HttpResponseRedirect('/details/%s/' % (product.id)) 

Répondre

0

Vous avez jamais récupéré l'objet original que vous essayez de mettre à jour. Vous devez le faire en premier!

+0

Bon point, merci! – Sophie

8

Pour mettre à jour un objet existant, vous devez fournir cet objet en tant que instance kwarg à votre formulaire. De the docs:

>>> from django.forms import ModelForm 

# Create the form class. 
>>> class ArticleForm(ModelForm): 
...  class Meta: 
...   model = Article 

# Creating a form to add an article. 
>>> form = ArticleForm() 

# Creating a form to change an existing article. 
>>> article = Article.objects.get(pk=1) 
>>> form = ArticleForm(instance=article) 
+0

Ça a marché! MERCI BEAUCOUP. Les données du formulaire sont maintenant éditées, sauvegardées et ne sont pas dupliquées. De plus, j'ai trouvé dans la documentation de Django que pk implique id__exact donc j'ai utilisé id__exact au lieu de pk. D'une certaine manière, pk me donnait des erreurs. Je voulais juste vous montrer mon code dans mon deuxième commentaire, et merci encore! – Sophie

+0

@login_required modifier def (requête, id = Aucun): #if id: si request.method == 'POST': produit = Product.objects.get (id__exact = id) form = ProductForm (request.POST, instance = produit) print "POST pRODUIT" si form.is_valid(): print "Afficher le formulaire" produit = form.save (commit = False) product.save() return HttpResponseRedirect ('/ details /% s /'% (product.id)) – Sophie

+0

@Sophie, si vous avez Vous voulez montrer le code qui fonctionne, c'est bien, mais ça irait probablement mieux comme un addendum à votre question. Aussi, n'oubliez pas d'accepter les réponses qui répondent à vos questions :) – eternicode