django-tagging probleme mit modelformset_factory()

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich habe gerade den "bulk editor" in PyLucid fertig gestellt: http://trac.pylucid.net/changeset/2473

Ich erstelle eine formset mit modelformset_factory() nun habe ich gerade gemerkt, das z.B. ein django-tagging field nicht richtig gespeichert wird und bin darüber gestolpert:
If your formset contains a ManyToManyField, you'll also need to call formset.save_m2m() to ensure the many-to-many relationships are saved properly.
von: http://docs.djangoproject.com/en/dev/to ... forms/#id2

Wenn ich aber ein formset.save_m2m() einfüge, gibt es ein AttributeError, weil die generierte FormSet keine save_m2m Methode hat. Sollte sie das nicht automatisch???

Das geht auch nicht:

Code: Alles auswählen

for form in formset.forms:
    if form.has_changed():
        form.save_m2m()
und das auch nicht:

Code: Alles auswählen

saved_items = formset.save(commit=False)
for instance in saved_items:
    instance.save()
    instance.save_m2m()
Der Fehler ist immer der selbe: Es gibt halt keine save_m2m() Methode.

Muß ich wirklich selber Hand anlegen und mit django.forms.models.save_instance arbeiten???

EDIT: Auch das geht nicht:

Code: Alles auswählen

                    saved_items = formset.save(commit=False)

                    from django.forms.models import save_instance

                    for form, instance in zip(formset.forms, saved_items):
                        save_instance(form, instance)
Es kommt zwar zu keinem Fehler, aber m2m werte sind dennoch nicht korrekt gespeichert :(

EDIT2: Der "Bulk Editor" ist das hier:
Bild
Volle Auflösung: http://www.flickr.com/photos/jensdiemer ... 8/sizes/o/
Zuletzt geändert von jens am Donnerstag 3. Dezember 2009, 18:05, insgesamt 1-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ah! Alles zurück :)

Hab mal mit phpMyAdmin nachgesehen... Das Tag Field wird gespeichert. Offensichtlich ist es ein cache Problem in django-tagging...

Edit: Hab mal ein ticket geschrieben: http://code.google.com/p/django-tagging ... ail?id=227

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich hab mal weiter geforscht. Es ist ein cache Problem.

Es muß doch an save_m2m() in Verbindung mit dem ModelFormSet liegen.

Denn: Bei einer ModelFormSet werden die Tags nicht in tagging.models.Tag und tagging.models.TaggedItem gespeichert, sondern nur in dem model tag field selber.

Eine einfache ModelForm funktioniert hingegen.

EDIT: Wenn ich mein Model registriere mit tagging.register(), dann funktioniert es. Dafür habe ich aber mehrere anderer Probleme:
1. Ich kann keine neuen Einträge mehr im Model machen, weil ein IntegityError "Column 'object_id' cannot be null" kommt. Ist auch bekannt: http://code.google.com/p/django-tagging ... ail?id=151
2. Tags erscheinen immer in der repr() variante, auch in einer html Form. Bsp: [<Tag: MeinTag1>, <Tag: MeinTag2>] Was natülich unbenutzbar ist... (Egal ob in eigenen views/forms oder im django admin)

Also was tun?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also ich denke es ist ein Bug in django-tagging. Hab ein Unittest dafür geschrieben, siehe: http://code.google.com/p/django-tagging ... ort=-id#c4

Dabei kann man sehen, das auch mit einem "formset.save_m2m()" die Modelle tagging.models.Tag und tagging.models.TaggedItem nicht aktualisiert werden :(

Ich denke ein django Fehler ist es nicht, weil es dafür auch einen unittest gibt, der bei mir auch funktioniert:
http://code.djangoproject.com/browser/d ... ls.py#L330

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Jetzt habe ich es nun endlich!
Der unittest für django-tagging war falsch. Ich hab formset.save() vergessen.

Der eigentliche Fehler ist aber ein anderer: Ich hab die queryset Quelle für modelformset_factory() mit einem .only() nur das Feld selektieren lassen, welches auch wirklich bearbeitet werden soll. Dachte das würde reichen. Aber das ist anscheinend mit dem tagging Feld das Problem!

Also ohne ein .only() werden tagging.models.Tag und tagging.models.TaggedItem aktualisiert und mit einem .only() halt nicht.

So. Problem gelöst. Aber: Warum ist das so?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten