web-dev-qa-db-fra.com

Comment mettre à jour un objet depuis le formulaire d'édition dans Django?

Peut-être une question pour les débutants, alors soyez indulgent avec moi.

J'ai un formulaire Django qui édite une certaine instance d'un modèle. Pour savoir quel objet est en cours d'édition, j'ai un champ caché contenant l'id de l'objet, ainsi que l'URL contenant l identité.

Première question: Avoir l'id de l'objet dans un champ caché est-il la bonne façon de le faire?

Ma préoccupation (peut-être non fondée) de ne l'avoir que dans le cadre de l'URL est que quelqu'un puisse alors ouvrir la page d'un identifiant d'objet, soumettre le formulaire à un autre, et cet objet sera alors écrasé. C'est pourquoi j'essaie d'utiliser un champ caché.

Le problème avec le stockage de l'identifiant dans un champ caché est que, lors de la validation du formulaire, Django se plaint que l'objet n'a pas d'identifiant unique (évidemment).

Deuxième question: Si un champ unique fait partie d'un formulaire, comment dire à Django d'ignorer le fait que cette clé existe déjà, afin de mettre à jour l'objet ?

48
Herman Schaaf

Pourquoi n'utilisez-vous pas simplement ModelForm?

# forms.py
# ...
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel

# views.py
# ...    
def my_view(request, id): 
    instance = get_object_or_404(MyModel, id=id)
    form = MyForm(request.POST or None, instance=instance)
    if form.is_valid():
        form.save()
        return redirect('next_view')
    return render(request, 'my_template.html', {'form': form}) 
93
Mikhail Korobov

Mise à jour pour Django 1.6 et version ultérieure

# forms.py
# ...
class MyForm(forms.ModelForm):

     class Meta:
     model = MyModel

# views.py  

def my_view(request, id): 
    instance = MyModel.objects.get(id=id)
    form = MyForm(request.POST or None, instance=instance)
    if form.is_valid():
          form.save()
          return redirect('next_view')
return direct_to_template(request, 'my_template.html', {'form': form})  
11
user3817584