Der eigentliche Fehler ist oft schnell gefunden. Die Lösung bzw. das Aufspüren des Ursprünglichen Problems dauert meist länger. So auch in diesem Falle.
Erst gestern hatte ich den neuen PyLucid bulk editor programmiert. So sieht's aus:

Bild in 100% größe
Das Problem: Wenn man ein django-tagging Feld bearbeitet, wurden die Tags nicht richtig aktualisiert.
Im bulk editor arbeite ich mit modelformset_factory(). Zuerst dachte ich, das ich irgendwie save_m2m() vergessen hatte. Da mir nicht sofort klar war, wie save_m2m() eigentlich zu benutzten war, habe ich erstmal Zeit damit verschwendet das heraus zu bekommen.
formset.save_m2m() ist erst dann verfügbar, wenn man formset.save(commit=False) macht. Und so kann man das Beispielsweise machen:
btw. "commit=False" ist auch interessant, wenn man vor dem eigentlichen Speichern die Objekte nochmal ändern möchte. z.B. ein update timestamp mitgeben...
Zurück zu meinem Tagging Feld Problem: An einem fehlenden save_m2m() lag es allerdings dann doch nicht. Erst nach dem ich einen unittest für tagging schrieb, ist mir das aufgefallen.
Das eigentliche Problem: Man darf das Quellen queryset nicht mit einem .only() einschränken. Denn genau das hatte ich im bulk editor gemacht. Die Idee dahinter: Was soll man alle Felder aus der Datenbank holen, wenn man eh nur eins anzeigen und verändern möchte??? Mit einem .only() spart man halt Ressourcen ein und das im Zeitalter der Klimaerwärmung ;)
Ein .only() klappt hingehen bei allen anderen Feldern, nur nicht beim tagging TagField :(
Man muß wissen, das ein TagField eigentlich ein normales CharField ist und kein m2m. Die Tags werden quasi doppelt gespeichert: Einmal als normalen String im CharField des getaggten Model. Und einmal in den internen tagging Modellen, die von Tagging selber verwaltet werden: tagging.models.Tag und tagging.models.TaggedItem
Das ganze dient natürlich zur Performance Steigerung...
Wenn man also das Formset mit einem queryset = queryset.only("tags") füttert, passiert das: Der Tag String im CharField wird geändert. Die internen tagging Tabellen allerdings nicht (auch mit formset.save_m2m() nicht)! Aber diese werden i.d.R. herangezogen wenn man auf das TagField zugreift.
Nun ist die Frage: Wer hat Schuld?
(Last update: 4. Dez. 2009, 10:31 by jens.)