Django 模型保存创建者和修改者

标签 django model save

我正在运行 django 1.8,我试图将当前登录的用户保存在数据库中的创建者和修改者字段中。我尝试了许多不同的组合来使其发挥作用,但我没有遇到任何运气。我必须在用户 ID 中使用硬编码进行编码,如下所示:

@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字段中保存当前登录的用户?

任何帮助将不胜感激!

最佳答案

经过更多搜索后,我发现了这个 post 我遵循了他们的大部分代码,但这是我的:

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

我的应用程序

  • 项目
    • admin.py # 更改了此内容
    • models.py # 更改了此内容
    • ...
  • 我的应用程序
    • 设置.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)

模型.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 的投入!

关于Django 模型保存创建者和修改者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38417863/

相关文章:

ruby-on-rails - Rails 模型中的成员变量未按预期设置

java - 如何开发代码以在所选文件中保存多个单词?

Django:如果用于查找,最好将 slug 保存到数据库或动态生成?

python - Django : Object didn't load in HTML template

django - Django从模型CharField引入外键

javascript - 如何使用 JavaScript 将 base64 图像保存到用户的磁盘?

python - 保存方法很多

django - 可选的外键应该是 NULL 还是应该指向一个空字符串

python - 如何通过ajax将django模型查询集发送到模板?

orm - Phalcon 中具有条件的相关模型