Seite 1 von 1

[Django] created_by in model automatisch befüllen Erklärung?

Verfasst: Freitag 7. Oktober 2011, 17:00
von blablabla
Hallo,

Ich bin neu hier und beschäftige mich mit Django nun möchte ich gerne in einem Model durch bearbeiten im Admin-Panel automatisch die Felder "erstellt_von" und updated_von" durch die User Tabelle befüllen.

Dies hab ich jetzt auch hinbekommen durch diese Seite https://code.djangoproject.com/wiki/Coo ... minAndUser
leider habe ich das Problem das ich einfach nicht verstehe wieso ich das so mache... und ich würde es gerne verstehen weil ich will es ja lernen und nicht nur abschreiben...

Was ich nicht verstehe ist genau dieser Punk:

Code: Alles auswählen

    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        instance.user = request.user
        instance.save()
        form.save_m2m()
        return instance

    def save_formset(self, request, form, formset, change): 
        def set_user(instance):
            instance.user = request.user
            instance.save()

        if formset.model == Comment:
            instances = formset.save(commit=False)
            map(set_user, instances)
            formset.save_m2m()
            return instances
        else:
            return formset.save()
Ich hoffe ihr könnt mir helfen das zu verstehen
Danke

edit sorry hatte mich verschrieben created_by = erstell_von...

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Freitag 7. Oktober 2011, 23:34
von Dauerbaustelle
Hä, suchst du nicht einfach nur die`auto_now_add`- und `auto_now`-Optionen von `DateTimeField`s?

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Samstag 8. Oktober 2011, 11:14
von blablabla
Hi,

nicht wirklich weil ich suche created_by (erstellt von) und und nicht created_at

wie gesagt ich habe es auch dadurch hinbekommen, allerdings verstehe ich den code leider nicht

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Samstag 8. Oktober 2011, 17:09
von Dauerbaustelle
In deiner Beschreibung steht aber "am" und nicht "von".

Warum updatest du nicht einfach von Hand die Felder in den Views?

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Sonntag 9. Oktober 2011, 11:54
von jens
Man kann es auch im Model.save() machen, wenn man eine Thread-local Lösung nutzt, z.B.:

Code: Alles auswählen

    def save(self, *args, **kwargs):
        current_user = ThreadLocal.get_current_user()

        if current_user and isinstance(current_user, User):
            if self.pk == None or kwargs.get("force_insert", False): # New model entry
                self.createby = current_user
            self.lastupdateby = current_user

        return super(UpdateInfoBaseModel, self).save(*args, **kwargs)
ThreadLocal.get_current_user() sieht so aus: https://github.com/jedie/django-tools/b ... adLocal.py

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Sonntag 9. Oktober 2011, 12:22
von Dauerbaustelle
uäääää

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Montag 10. Oktober 2011, 08:31
von blablabla
@jens

Danke für den Tipp, werd ich mir auf alle Fälle ansehen.

jedoch ändert das nichts an der Tatsache das ich oben stehenden Code irgendwie nicht ganz Raffe...


@per hand updaten
Der Sinn der Sache soll sein das ein User der sich im Adminpanel anmeldet und etwas ändert, in der Datenbank gespeichert wird damit man im Nachhinein weiß wer was wann gemacht hat.

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Montag 10. Oktober 2011, 08:36
von jens
Dauerbaustelle hat geschrieben:uäääää
Was willst du uns damit sagen?

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Mittwoch 12. Oktober 2011, 15:56
von apollo13
@jens: Ich nehme an er will damit sagen, dass du nicht immer Threadlocals als Möglichkeit anbieten sollst, vor allem wenn Django selbst dafür ne API abietet.

@topic: Uhm, das Beispiel dort ist etwas broken ich habs mal angepasst: https://code.djangoproject.com/wiki/Coo ... minAndUser

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Mittwoch 12. Oktober 2011, 16:08
von jens
apollo13 hat geschrieben:@jens: Ich nehme an er will damit sagen, dass du nicht immer Threadlocals als Möglichkeit anbieten sollst, vor allem wenn Django selbst dafür ne API abietet.
Die API bezieht sich aber nur auf den Admin Teil. Wenn man in eigenen views irgendwas ändert, wir der User nicht fest gehalten.

Mit einer Threadlocals Lösung im Model, werden alle Änderungen berücksichtigt, weil es halt tiefer ansetzt... Was ist so schlimm daran?

EDIT: Ach, bei der Lösung von https://code.djangoproject.com/wiki/Coo ... minAndUser muß man auch zweimal im Grunde das selbe machen. Hat man einen oder mehere views, hat man alles nochmal doppelt. Das ist nicht DRY...

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Mittwoch 12. Oktober 2011, 16:40
von apollo13
jens hat geschrieben:
apollo13 hat geschrieben:@jens: Ich nehme an er will damit sagen, dass du nicht immer Threadlocals als Möglichkeit anbieten sollst, vor allem wenn Django selbst dafür ne API abietet.
Die API bezieht sich aber nur auf den Admin Teil. Wenn man in eigenen views irgendwas ändert, wir der User nicht fest gehalten.
Er hat ja nur vom admin geredet…
Mit einer Threadlocals Lösung im Model, werden alle Änderungen berücksichtigt, weil es halt tiefer ansetzt... Was ist so schlimm daran?
Tendenziell fehleranfälliger und schwerer zu debuggen. Und was ist wenn man es aber nicht in allen Änderungen haben will? dann hat man ja wieder nen super Problem…
EDIT: Ach, bei der Lösung von https://code.djangoproject.com/wiki/Coo ... minAndUser muß man auch zweimal im Grunde das selbe machen. Hat man einen oder mehere views, hat man alles nochmal doppelt. Das ist nicht DRY...
Ach und die Kopplung von Request an deine Models ist jetzt sauberer Programmierstil? Du koppelst damit 2 Teile die eigentlich nicht zusammengehören.

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Mittwoch 12. Oktober 2011, 17:56
von blablabla
was ich mich ganze zeit frage ist noch immer für was brauch ich zB die save_formset funktion?

hab das ganze jetzt mal bei mir ohne dem probiert und das funktioniert genauso...

Mein def save_model sieht zurzeit so aus

Code: Alles auswählen

    def save_model(self, request, obj, form, change):
        instance = form.save(commit=False)
        if not instance.id:
            instance.erstellt_von = request.user
        instance.updated_von = request.user
        instance.save()
        form.save_m2m()
        return instance

Re: [Django] created_by in model automatisch befüllen Erklär

Verfasst: Donnerstag 13. Oktober 2011, 20:44
von apollo13
Das save_model in dieser Form ist auch eher kaputt also sonstwas, bitte schau die meine Änderungen im von dir geposteten Link an… save_formset brauchst klarerweise nur für die inlines, wennst keine hast brauchst es nicht…