65 Stimmen

Wie man ein Objekt aus bearbeiten Form in Django aktualisieren?

Möglicherweise eine Frage für Neulinge, daher bitte ich um Nachsicht mit mir.

Ich habe ein Django-Formular, das eine bestimmte Instanz eines Modells bearbeitet. Um zu wissen, welches Objekt bearbeitet wird, habe ich ein verstecktes Feld, das die ID des Objekts enthält, zusammen mit der URL, die die ID enthält.

Erste Frage : Ist es richtig, die ID des Objekts in einem verborgenen Feld zu speichern?

Meine (möglicherweise unbegründete) Besorgnis darüber, dass es nur Teil der URL ist, besteht darin, dass jemand die Seite einer Objekt-ID öffnen und das Formular an ein anderes Objekt senden könnte, das dann überschrieben wird. Deshalb versuche ich, ein verstecktes Feld zu verwenden.

Das Problem bei der Speicherung der ID in einem versteckten Feld ist, dass Django bei der Validierung des Formulars bemängelt, dass das Objekt keine eindeutige ID hat (offensichtlich).

Zweite Frage : Wenn ein eindeutiges Feld Teil eines Formulars ist, wie kann man Django sagen, dass es die Tatsache ignorieren soll, dass dieser Schlüssel bereits existiert, um das Objekt zu aktualisieren?

0 Stimmen

Können Sie mir Ihr Formular zeigen? PS: Ja, ohne Sicherheitsvorkehrungen (Genehmigungen), /edit/{{ id }}/ wäre für jeden zugänglich und gefährlich.

1 Stimmen

Ich habe zwar Sicherheitsvorkehrungen getroffen, wie z. B. die Überprüfung, ob das Objekt dem angemeldeten Benutzer gehört - aber selbst dann könnte dieser Benutzer (aus mir unbekannten Gründen) ein unbeabsichtigtes Objekt bearbeiten.

134voto

Mikhail Korobov Punkte 21059

Warum verwenden Sie nicht einfach 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}) 

Ver https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/#the-save-method für weitere Einzelheiten.

10 Stimmen

Fantastisch - das ist es instance Parameter, den ich vermisst habe. Im World Wide Web scheint es einen ziemlichen Mangel an Tutorials zur Bearbeitung von Objekten mit Formularen in Django zu geben.

1 Stimmen

Das ist der richtige Weg, aber er beantwortet nicht: Wie hat Ihre Ansicht dieses "id"-Argument erhalten? Sind die Url-Zuordnung oder ein verstecktes Feld die einzigen Möglichkeiten?

1 Stimmen

Ja, und daran ist nichts auszusetzen. Sie können wahrscheinlich mit Sitzungen jonglieren, aber ich sehe wirklich keinen Sinn darin. Wenn die ID an die Ansicht übergeben wird, dann kann die Ansicht feststellen, ob der Benutzer die Berechtigung hat, das Objekt zu aktualisieren oder nicht, und der Entwickler sollte diese Prüfung unabhängig von der Art und Weise erzwingen, wie die Ansicht die ID des Objekts erhält.

15voto

user3817584 Punkte 157

Update für Django 1.6 und weitere Versionen

# 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})

0 Stimmen

Wenn die Ansicht eine Datei oder ein Bild enthält, wie lautet dann die Beschreibung der Ansicht?

0 Stimmen

Leonardo MyForm(request.POST oder None, request.FILES oder None, ...)

0 Stimmen

Wie übergebe ich ein Argument aus der Vorlage an die Funktion my_view? Ich meine mit {% url 'my_view' %}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X