2016-08-04 26 views
0

Ich bin relativ neu (1.8) django und haben, um dieses Problem zu lesen, die alle Punkte der save_formset Funktion als pro diesen Link zwingendenDjango Admin - Speichern inlines zwingende save_formset

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset

zu Hatte hinzugefügt ein alter thread (Django admin - how to save inlines?) wollte aber als separaten thread aufziehen um bessere sicht zu bekommen und außerdem wurde das schon beantwortet.

Die folgende Funktion funktioniert, wo ich versuche, das Formular vor dem Speichern zu ändern, d. H. Die Prüffelder (erstellt/geändert) in USER und Kleinbuchstaben das Attribut 'enum_value_en' zu aktualisieren. Alle Werke, wenn der Benutzer nur 1 Eintrag tritt aber als Zugabe mehr aktualisiert es alle Einträge mit dem gleichen Wert (dh ‚enum_value_en‘ in der Datenbank.

def save_formset(self, request, form, formset, change): 
    instances = formset.save(commit=False) # gets instance from memory and add to it before saving it 
    for obj in formset.deleted_objects: 
     obj.delete() 
    for instance in instances: 
     for form in formset: # cleaned_data is only available on the form, so you have to iterate over formset 
      instance.modified_by = request.user 
      instance.created_by = request.user 
      instance.lowercase_enum_value_en = form.cleaned_data['enum_value_en'].lower() 
      instance.save() 
    formset.save_m2m() 
  • Ex.

    wenn Einträge sind ‚a '& 'b' sind die Kleinen Attribute auf 'b' auf beiden Datensätze.

PS. Wäre auch dankbar, wenn jemand könnte o Lassen Sie einige Kommentare zu ihren Vorschlägen kommen, damit ich jede Codezeile verstehen kann.

Am meisten geschätzt.

Antwort

0

Das Problem besteht darin, dass Sie die Instanzen durchlaufen und dann die Formsets darin durchlaufen. Sagen wir, es gibt 5 Formen, das heißt, Sie speichern jede Instanz 5 Mal, einmal für jede Instanz. Jede Instanz erhält den gleichen Wert aus dem endgültigen Formset.

In diesem Fall glaube ich nicht, dass Sie auf cleaned_data des Formulars zugreifen müssen. Greifen Sie einfach auf das Attribut enum_value_en der Instanz zu. Dies bedeutet, dass Sie nicht die innere Schleife benötigen, die Ihr Problem verursacht.

for instance in instances: 
    instance.lowercase_enum_value_en = instance.enum_value_en.lower() 
    instance.modified_by = request.user 
    instance.created_by = request.user 
    instance.save() 
+0

Vielen Dank Alasdair für die Lösung und Erklärung - es hat funktioniert. Ich habe übermäßig viel Zeit damit verbracht, das Problem zu lösen. Frustrierend in unserer Entwicklungsumgebung verwenden wir Supervisor, um Dienste neu zu starten, und haben versucht, einen interaktiven Debugger wie Werkzeug zu verwenden, können dies aber nicht. ** Kannst du mir etwas vorschlagen **. Noch einmal vielen Dank. –

+0

Tut mir leid, ich habe keine Vorschläge über interaktive Debugger. – Alasdair

+0

Danke trotzdem. –