2012-04-13 10 views
1

Ich machte benutzerdefinierte Formsatz mit benutzerdefinierten sauberen Methode darin. Es ist wie folgt aussehen:Wie "DELETE" Parameter auf False in django benutzerdefinierte Methode sauberes Formset zurücksetzen

class MyFormsetBase(forms.models.BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     .... 
     super(AdvOrderBidFormsetBase, self).__init__(*args, **kwargs) 


    def clean(self): 
     .... 
     if error: 
      raise forms.ValidationError('some validation error') 

Als ich in irgendeiner Form (mit falschem paramaeters) von formset und drücken Sie Submit-Button Löschen (Form hat Feldwert DELETE == True) Ich error = True in meiner sauberen Methode bekommen, damit ich Validation und Rückkehr um ein Fenster zu bilden. Aber der DELETE-Feldwert in Formular wird nicht zurückgesetzt. Und wenn ich das nächste Mal mein Formular abschicke, werde ich denselben ValidationError bekommen. Also, könnte ich irgendwie Wert von DELETE-Feld in meiner benutzerdefinierten sauberen Methode ändern?

Antwort

0

Was genau geben Sie in Ihrer sauberen Methode zurück?

Wenn das Attribut "DELETE Feldwert" (oder was immer Sie mit dieser Phrase meinen) noch in Ihren bereinigten Daten enthalten ist, wird es beibehalten.

Um es zu entfernen, löschen Sie es aus Ihren bereinigten Daten.

ähnliche Probleme hier berichtet werden, vielleicht hilft diese Clearing Django form fields on form validation error?

+0

Nach [hier] (https://docs.djangoproject.com/en/dev/topics/forms/formsets/#custom-formset-validation) formset des cutom saubere Methode gibt nichts zurück. Und das DELETE-Feld ist ein extra [field] (https://docs.djangoproject.com/en/dev/topics/forms/formsets/#can-delete), das hinzugefügt wird, wenn wir can_delete = True setzen. Ich habe versucht, es aus Formset-Formularen zu öffnen, aber das hilft nicht –

+0

Können Sie den Code angeben, wo Sie das Formset tatsächlich wiedergeben? Wenn du es aus der Anfrage initialisierst, kannst du sicherlich an einer request.copy() arbeiten und die DELETE = True Felder entfernen ... – cfedermann

+0

Leider verwende ich Mixin View und konnte keine neue Logik hinzufügen, aber ich denke das Ich könnte einige zusätzliche Parameter zu meinem Formular hinzufügen, es in Formularvorlage überprüfen und Feldwert von JS zurücksetzen. –

1

Auch wenn diese Frage ist ziemlich alt, ich in das gleiche Problem vor kurzem lief. Ich war in der Lage, das DELETE-Feld durch Optimieren mit dem form.data-Wörterbuch zurückzusetzen. Nicht eine hübsche Lösung, aber es funktioniert:

class MyFormset(BaseModelFormSet): 
    def clean(self): 
     for form in self.deleted_forms: 
      #iterating over only the forms marked for being delete 
      if <YOUR_CONDITION>: 
       form.data = form.data.copy() # form.data is immutable unless we copy it 
       form.data.pop('{prefix}-DELETE'.format(form.prefix)) # Delete the correct 'DELETE' field from the POST data 
       form.cleaned_data.pop('DELETE') # Also remove the field from cleaned data as the formset checks this field for deletion