2016-07-17 149 views
0

我正在运行djando 1.8,我试图保存当前登录的用户在我的数据库中的字段创建和修改。我已经尝试了许多不同的组合,让这个工作,但我没有碰到任何运气。我必须将代码与硬编码工作的用户ID如下:Django模型保存创建和修改

@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) 

如果我尝试任何注释掉的代码:

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

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

我得到的以下错误:

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

NameError at /admin/project/project/add/ global name 'request' is not defined

再次我的问题是我如何保存当前登录的用户在我CREATED_BY和modified_by领域?

任何帮助将不胜感激!

+1

您正在查找的地方没有可用的请求对象。你需要在视图函数/类中才能访问'request'。此外,可以在请求的上下文之外修改模型(例如,在shell中,从信号中),所以无论何时调用save(),都有一个请求和一个登录用户。 – solarissmoke

+0

另请注意,Django管理员已经保存了通过管理员进行的模型更改的历史记录(每个模型都有一个“历史记录”视图)。 – solarissmoke

回答

0

搜索的更多一点,我发现在这之后post我跟着他们的大部分代码,但这里是我的:

这是我的应用程序文件夹结构:

MYAPP

  • 项目
    • admin.py#改变了这个
    • models.py#changed thi小号
    • ...
  • MYAPP
    • setting.py
    • url.py
    • ...

我的新admin.py

from django.contrib import admin 
from . import models 

class ProjectAdmin(admin.ModelAdmin): 
    fields = ('name', 'jobNumber', 'contractor', 'assigned_to', 'status') 
    def save_model(self, request, obj, form, change): 
     instance = form.save(commit=False) 
     if not hasattr(instance, 'created_by'): 
      instance.created_by = request.user 
     instance.modified_by = request.user 
     instance.save() 
     form.save_m2m() 
     return instance 

admin.site.register(models.Project,ProjectAdmin) 

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) 

我猜的伎俩正赶上在admin.py文件的请求。感谢solarissmoke的输入!