2016-08-16 4 views
1

Ich habe eine Formular-Basisklasse, die überprüft, ob sich die Instanz, die das Formular aktualisiert, geändert hat, und speichert sie nicht, wenn sie sich nicht geändert hat.Django-Musterformulare - deaktivierte Felder in "changed_data"

das ist in meiner benutzerdefinierten Modellform, außer Kraft setzen ich sparen:

class MyModelForm(models.ModelForm): 
    # .. more code here.. 
     def save(self, commit=True): 
      if self.has_changed(): 
       # Won't do anything if the instance did not changed 
       return self.instance 
      return super(MyModelForm, self).save(commit) 

Viele meiner Formulare verwenden diese Basisklasse. Nun hat eines meiner Formulare ein paar Felder, die ich auf disabled=True (Django 1.9 +) eingestellt habe. So in einen meiner Formen:

def __init__(self, *args, **kwargs): 
     ## ..code 
     self.fields['address'].disabled = True 

Nach vielen Debugging, warum die form.has_changed() ist True (also die Instanz ohne Grund gespeichert wird), auch wenn ich das Formular speichern, ohne die Instanz zu ändern. Ich habe herausgefunden, dass Django deaktivierte Felder in changed_data enthält - was keinen Sinn macht, da deaktivierte Felder vom Benutzer sowieso nicht geändert werden sollten.

Fehle ich etwas oder es ist ein Fehler, oder vielleicht, wie es funktionieren sollte? Wie kann ich dies ohne zu viele Änderungen beheben, wie die Formular-Basisklasse in meinem Code viel verwendet wird.

+0

Ich habe auch diese Frage. Konntest du eine Lösung finden? –

+0

Nicht genau, ich habe es manuell gelöst. d. h. deaktivierte Felder aus changed_data entfernt – user3599803

Antwort

1

Dies ist ein bekanntes Problem mit DjangoProject mit dem Ticket um https://code.djangoproject.com/ticket/27431 und die entsprechende PR bei https://github.com/django/django/pull/7502. Während diese Antwort geschrieben wird, wird die PR mit master zusammengeführt, so dass die neueste Version dies behoben haben sollte.

Eine Abhilfe dieses

wie folgt
for form in formset: 
    if form.has_changed() and form not in formset.deleted_forms: 
     fields = form.changed_data 
     up_f = [field for field in fields if not form.fields[field].disabled] 
     if len(up_f) > 0: 
      updated_data.append(form.cleaned_data) 

Dies führt zu updated_data die einzigen Formen aufweisen, die aktualisiert werden und nicht gelöscht.

Verwandte Themen