3 votes

Django, comment inclure des données préexistantes dans la vue d'un formulaire de mise à jour ?

Je n'arrive pas à voir les données préexistantes du formulaire lors de la mise à jour. Les formulaires fonctionnent bien, la base de données est mise à jour après la soumission, mais pour soumettre le formulaire, l'utilisateur doit saisir toutes les données du formulaire (y compris les données qui ne seront pas mises à jour). Lors de la nouvelle saisie, les données précédentes ne sont pas visibles. Existe-t-il un moyen d'afficher les données actuelles de l'instance de modèle en cours de mise à jour dans les champs du formulaire ?

Formes :

UpdateSomethingForm(forms.ModelForm):
    class Meta:
    model = Something
    fields = ['field1', 'field2', 'field3']

Vues :

def update_something(request, object_pk):
    form = UpdateSomethingForm()
    context_dict = {}
    try:
        instance = Something.objects.get(pk=object_pk)
        context_dict['instance'] = instance
    except Something.DoesNotExist:
        context_dict['instance'] = None
    if request.method == 'POST':
        form = UpdateSomethingForm(request.POST, instance=instance)
        if form.is_valid():
            form.save(commit=True)
            return HttpResponseRedirect('/home')
        else:
            print(form.errors)
    context_dict['form'] = form
    return render(request, 'form.html', context=context_dict)

Html :

<form role="form" method="post">
   {% csrf_token %}
   {{ form|bootstrap }}
   <div class="form-group">
      <button type="submit" class="btn btn-primary">Submit</button>
    </div>
</form>

3voto

Daniel Roseman Points 199743

Vous avez transmis l'argument d'instance à POST, mais pas à GET.

form = UpdateSomethingForm(instance=instance)

dans son intégralité :

def update_something(request, object_pk):
    try:
        instance = Something.objects.get(pk=object_pk)
    except Something.DoesNotExist:
        instance = None
    if request.method == 'POST':
        form = UpdateSomethingForm(request.POST, instance=instance)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/home')
    else:
        form = UpdateSomethingForm(instance=instance)
    context_dict = {'form': form, 'instance': instance}
    return render(request, 'form.html', context_dict)

1voto

CommuSoft Points 6439

Le principal problème est que vous construisez un Form même si l'instance peut être trouvée. Mais vous rendez la vue plutôt "chaotique" en premier lieu.

Une vision plus lisible serait probablement la suivante :

def update_something(request, object_pk):
    context_dict = {}
    try:
        instance = Something.objects.get(pk=object_pk)
    except Something.DoesNotExist:
        instance = None
    context_dict['instance'] = instance
    if request.method == 'POST':
        form = UpdateSomethingForm(request.POST, instance=instance)
        if form.is_valid():
            form.save(commit=True)
            return redirect('view_name')
    else:
        form = UpdateSomethingForm(instance=instance)
    context_dict['form'] = form
    return render(request, 'form.html', context=context_dict)

Nous nous assurons ici que le instance est toujours définie, même dans le cas où la variable except est le "tir".

En outre, il est probablement préférable d'utiliser un redirect(..) et transmettre le nom de la vue sur une URL, car si vous changez l'URL de cette vue, cela fonctionnera toujours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X