【问题标题】:Django Model Save created by and modified byDjango 模型保存创建者和修改者
【发布时间】:2016-11-19 22:45:09
【问题描述】:

我正在运行 django 1.8,我正在尝试将当前登录的用户保存在我的数据库中的 created by 和 modified by 字段中。我已经尝试了许多不同的组合来让它工作,但我没有遇到任何运气。我必须像这样在用户 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)

我收到以下错误:

/admin/project/project/add/ 处的 KeyError '请求'

/admin/project/project/add/ 处的名称错误 全局名称“请求”未定义

再一次,我的问题是如何将当前登录的用户保存在我的 created_by 和 modified_by 字段中?

任何帮助将不胜感激!

【问题讨论】:

  • 您正在查找的位置没有可用的request 对象。您需要在视图函数/类中才能访问request。此外,模型可以在请求的上下文之外进行修改(例如,在 shell 中,来自信号),因此您不能假设每当调用 save() 时都会有请求和登录用户。
  • 另请注意,Django 管理员已经保存了通过管理员所做的模型更改历史记录(每个模型都有一个“历史记录”视图)。

标签: django model save


【解决方案1】:

你可以使用 django-currentuser 包。

例如:

from django_currentuser.middleware import get_current_authenticated_user

class Project(models.Model):
    ....

    self.modifier = get_current_authenticated_user()
    if not self.id:
        self.creator = get_current_authenticated_user()
    
    ....

【讨论】:

  • 使用自定义用户模型获取无。有什么帮助吗?
  • 该软件包似乎无法正常工作。运行makemigrations 时,它给出错误提示“'created_by' 与 'updated_by' 的反向访问器冲突”
  • stackoverflow.com/questions/1142378/…我在这里得到了这个问题的答案
【解决方案2】:

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

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

我的应用程序

  • 项目
    • admin.py #改变了这个
    • models.py # 改变了这个
    • ...
  • 我的应用程序
    • setting.py
    • url.py
    • ...

我的新管理员.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 的意见!

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2013-10-16
    • 1970-01-01
    • 2021-02-18
    • 2020-07-23
    相关资源
    最近更新 更多