2016-03-26 5 views
0

Ich versuche, den Sitzungsbenutzer in die save() -Methode meines Modells zu ziehen. The docs for HttpRequest und alle Beispiele, die ich gefunden habe, nehmen an, dass Sie bereits das Objekt instanziiert haben, aber ich kann nicht scheinen, eine Methode zu finden, die die Instanziierung tut.Wie bekomme ich den aktuellen Benutzer für mein created_by Feld in Django 1.9?

Ich denke, ich sollte HttpRequest.user verwenden, aber ich weiß nicht, wie die Instanz in meinem Modell zu generieren, damit ich es tatsächlich tun kann.

Hier ist meine Save() überschreiben. Es erzeugt type object 'HttpRequest' has no attribute 'user', aber wenn man bedenkt das ist eine Klasse und nicht eine Objektreferenz, die nicht wirklich überraschend .: ist

def save(self, *args, **kwargs): 
    ''' On save, update timestamps ''' 
    if not hasattr(self, 'id'): 
     self.date_created = timezone.now() 
     self.created_by = HttpRequest.user 

    self.last_updated_date = timezone.now() 
    self.last_updated_by = HttpRequest.user 

    super(Caregiver, self).save(*args, **kwargs) 

views.py für weitere Informationen hinzugefügt

class CaregiverCreateView(CreateView): 
    template_name = 'single_form_generic.html' 
    model = Caregiver 
    form_class = CaregiverCreateForm 

Antwort

0

Ich hatte um ein wenig zu graben, aber ich habe für Sie Zukunft Googler eine Antwort am Ende der Suche:

Die class based view docs eigentlich eine haben relevantes Beispiel. Da die Ansicht bereits Zugriff auf die Anforderung hat und Formular und Modell verknüpft sind, müssen Sie sie nur in die Ansichtsübergabe einfügen, indem Sie dort die Methode form_valid überschreiben.

def form_valid(self, form): 
    form.instance.created_by = self.request.user 
    form.instance.last_updated_by = self.request.user 
    return super(CaregiverCreateView, self).form_valid(form) 
1

Wenn Sie Aufruf save() ausdrücklich könnte, können Sie die Benutzerinstanz direkt an die Methode übergeben:

def save(self, user, *args, **kwargs): 
    # use the user 

Dann, wenn Sie es in views.py nennen, tun:

instance.save(request.user) 
+0

I Klasse basierte Ansichten bin mit:

Einmal eingerichtet, kann es wie folgt aufgerufen werden. Wie würde ich das hinzufügen? Ich habe views.py in meiner Frage zur besseren Übersicht hinzugefügt. – meteorainer

+0

Während ich diese Methode nicht benutzt habe, habe ich sie +1 gegeben, weil sie mich zur Antwort geführt hat. – meteorainer

+0

Cool. Freut mich, dass du deine Antwort gefunden hast. Ich habe mir den zweiten Blick angesehen und klingt, als ob das, was Sie zu tun versuchen, vollständig erreicht werden kann, indem Sie die form_valid-Methode für klassenbasierte Ansichten außer Kraft setzen. –

2

django-cuser kann dies leicht tun. Diese Bibliothek fügt Middleware hinzu, die in einer Ansicht, Modellmethode usw. aufgerufen werden kann, um den aktuellen Benutzer zu erhalten. Wenn es Ihnen gut geht, dass der Benutzer bei der Speichermethode des Modells zugewiesen wird, müssen Sie nur die Middleware aufrufen, um die Sitzung wie folgt zu überprüfen.

from cuser.middleware import CuserMiddleware 

class YourModel(models.Model): 
    def save(self, *args, **kwargs): 
     self.created_by = CuserMiddleware.get_user() 
     super(YourModel,self).save(*args, **kwargs) 
Verwandte Themen