2016-07-17 15 views
0

Ich benutze djando 1.8, ich versuche den aktuell angemeldeten Benutzer in den Feldern "erstellt von" und "geändert von" in meiner Datenbank zu speichern. Ich habe viele verschiedene Kombinationen ausprobiert, um das zum Laufen zu bringen, aber ich habe kein Glück. Ich muss Code mit harten Codierung in einem Benutzer-ID arbeitet wie folgt:Django Modell Speichern, erstellt und geändert von

@python_2_unicode_compatible # only if you need to support Python 2 
class Project(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Name") 
    jobNumber = models.CharField(max_length=8) 
    shopOut = models.DateTimeField(null=True) 
    shopIn = models.DateTimeField(null=True) 
    completion = models.DateTimeField(null=True) 
    installation_date = models.DateTimeField(null=True) 
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, default=101) 
    created_by = models.ForeignKey(User, related_name='Project_created_by') 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_by = models.ForeignKey(User, related_name='Project_modified_by') 
    modified_date = models.DateTimeField(auto_now=True) 
    assigned_to = models.ForeignKey(User, related_name='Project_assigned_to', default=1) 
    status = models.ForeignKey('Status', related_name='Project_status', default=1) 
    def __str__(self): 
     return self.name 
    def save(self, *args, **kwargs): 
     if not self.id: 
      self.created_by = User.objects.get(id=1) 
      #self.created_by = User.objects.get(id=kwargs['request'].user) 
      #self.created_by = User.objects.get(id=request.user) 
      self.modified_by = User.objects.get(id=1) 
      #self.modified_by = User.objects.get(id=kwargs['request'].user) 
      #self.modified_by = User.objects.get(id=request.user) 
      super(Project, self).save(*args, **kwargs) 
      year = datetime.datetime.now().year 
      self.jobNumber = '{}{:04d}'.format(year, self.id) 
     self.modified_by = User.objects.get(id=1) 
     #self.modified_by = User.objects.get(id=kwargs['request'].user) 
     #self.modified_by = User.objects.get(id=request.user) 
     super(Project, self).save(*args, **kwargs) 

Wenn ich einen der Code versuchen, auf Kommentar:

self.created_by = User.objects.get(id=kwargs['request'].user) 

oder

self.created_by = User.objects.get(id=request.user) 

ich die Folgefehler:

KeyError at /admin/project/project/add/ 'request'

oder

Noch einmal meine Frage ist, wie speichere ich den aktuellen angemeldeten Benutzer in meinem created_by und modified_by Felder?

Jede Hilfe würde sehr geschätzt werden!

+1

Es gibt kein 'request' Objekt an dem Ort, an dem Sie suchen. Sie müssen innerhalb einer View-Funktion/Klasse sein, um Zugriff auf eine "Anfrage" zu haben. Darüber hinaus können Modelle außerhalb des Kontextes einer Anfrage (z. B. in der Shell, von Signalen) modifiziert werden, so dass Sie nicht davon ausgehen können, dass, wenn 'save()' aufgerufen wird, eine Anfrage und ein eingeloggter Benutzer vorhanden sind. – solarissmoke

+0

Beachten Sie auch, dass der Django-Administrator bereits eine Historie von Modelländerungen über den Administrator speichert (jedes Modell hat eine "History" -Ansicht). – solarissmoke

Antwort

0

ein wenig mehr nach der Suche ich diese post gefunden folgte ich den größten Teil ihres Codes, aber hier ist meins:

Dies ist meine app Ordnerstruktur:

myapp

  • Projekt
    • admin.py # geändert
    • models.py # geändert thi s
    • ...
  • myapp
    • setting.py
    • url.py
    • ...

mein neues admin.py

models.py

import datetime 
from django.db import models 
from django.utils.encoding import python_2_unicode_compatible 
from django.contrib.auth.models import User 
from contractor.models import Contractor 

@python_2_unicode_compatible # only if you need to support Python 2 
class Project(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Name") 
    jobNumber = models.CharField(max_length=8) 
    shopOut = models.DateTimeField(null=True) 
    shopIn = models.DateTimeField(null=True) 
    completion = models.DateTimeField(null=True) 
    installation_date = models.DateTimeField(null=True) 
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, default=101) 
    created_by = models.ForeignKey(User, related_name='Project_created_by') 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_by = models.ForeignKey(User, related_name='Project_modified_by') 
    modified_date = models.DateTimeField(auto_now=True) 
    assigned_to = models.ForeignKey(User, related_name='Project_assigned_to', default=1) 
    status = models.ForeignKey('Status', related_name='Project_status', default=1) 
    def __str__(self): 
     return self.name 
    def save(self, *args, **kwargs): 
     if not self.id: 
      super(Project, self).save(*args, **kwargs) 
      year = datetime.datetime.now().year 
      self.jobNumber = '{}{:04d}'.format(year, self.id) 
     super(Project, self).save(*args, **kwargs) 

Ich denke, der Trick in der admin.py Datei, um die Anforderung zu kontrollieren. Danke Solarissmoke für Ihre Eingabe!