2016-06-13 19 views
0

Also verwende ich Djangos Model Formset, um Formulare für verschiedene Daten zu erstellen. Es funktioniert gut, aber ich möchte eine Funktion hinzufügen, wo, wenn ein Benutzer das Formset anzeigt und, sagen wir, 2 der 10 Elemente aktualisiert, kann ich nur die 2 aktualisiert verfolgen und eine Nachricht wie "Sie haben 2 Elemente aktualisiert haben " Art der Sache.Django Model Formset: Verfolgen Sie nur Änderungen an den Elementen, die im Set aktualisiert/gespeichert wurden?

Haben Django Model Formsets eine eingebaute API dafür? Ich kann es nicht auf den Django Docs finden.

Ich habe verschiedene Ansätze ausprobiert, aber halten dies immer, wenn Sie den Code von Peter angeboten mit unter:

'Attendance' object has no attribute 'has_changed.' 

Wenn ich formset.has_changed Schalter form.has_changed(), erhalte ich

'list' object has no attribute 'has_changed' 

My View und Post-Methode

class AttendanceView(TemplateView): 

    template_name = 'example.html' 

    def changed_forms(self, formset): 
     return sum(1 for form in formset if form.has_changed()) 

def post(self, request, *args, **kwargs): 
    formset = AttendanceFormSet(request.POST) 
    if formset.is_valid(): 
     formset = formset.save() 
     forms_changed = self.changed_forms(formset) 
     context = self.get_context_data(**kwargs) 
     context['total_changed_forms'] = forms_changed 
     return self.render_to_response(context) 
    else: 
     return HttpResponse("POST failed") 

Also habe ich es aus, ändern sie einfach:

formset = formset.save() 

zu

formset.save() 

Antwort

2

Formsets haben eine has_changed Methode, ob oder ob nicht jeder seiner Formen verändert wurden berichtet. Das ist nicht genau das, wonach Sie suchen, aber wenn Sie sich die Implementierung ansehen, sollte es Ihnen zeigen, wie es geht. Diese Methode ist:

def has_changed(self): 
    """ 
    Returns true if data in any form differs from initial. 
    """ 
    return any(form.has_changed() for form in self) 

So können Sie geändert Formen mit Zahl:

def changed_forms(formset): 
    return sum(1 for form in formset if form.has_changed()) 

Oder wenn Sie bequem die ganze Zahl Bedeutungen von Booleschen Werten:

return sum(form.has_changed() for form in formset) 

Ich persönlich finde das ist im Vergleich zu der expliziteren Abbildung von true zu 1 unattraktiv, aber die Meinungen sind dort unterschiedlich.

+0

danke @peter DeGlopper ... wie könnte ich diese Daten zum Kontext meiner Vorlage hinzufügen? Wenn ich diese Daten in meiner Vorlage ausgeben möchte? –

+0

Kennen Sie Daten generell zu einem Kontext? Das wäre nicht sehr anders. Es ist offensichtlich nur möglich, nachdem das Formset an 'POST'-Daten gebunden wurde. –

+0

Hey Peter, ich bekomme immer Fehler. Ich habe meine obigen Codebeispiele aktualisiert. Sieht nicht so aus, als würde mein Formular die Methode has_changed() übernehmen ... –