由创建和修改的Django模型保存 [英] Django Model Save created by and modified by

查看:88
本文介绍了由创建和修改的Django模型保存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在运行djando 1.8,我试图将当前登录的用户保存在数据库的created by和by by字段中.我已经尝试过许多不同的组合来使它起作用,但是我并没有碰到任何运气.我必须像这样在用户ID中使用硬编码进行编码:

I am running djando 1.8, I am trying to save the current logged in user in the created by and modified by fields in my database. I have tried many different combination of getting this to work, but I am not running into any luck. I have to code working with hard coding in a user id like so:

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

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

If I try any of the code commented out:

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

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

我收到以下错误:

/Admin/project/project/add/中的KeyError 请求"

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

在/admin/project/project/add/中的

NameError 未定义全局名称"request"

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

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

Once again my question is how do I save the current logged in user in my created_by and modified_by fields?

任何帮助将不胜感激!

推荐答案

搜索了更多内容后,我发现了这个

After searching a little more I found this post I followed most of their code, but here is mine:

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

This is my app folder structure:

myapp

  • 项目
    • admin.py#更改了此
    • models.py#对此进行了更改
    • ...
    • project
      • admin.py # changed this
      • models.py # changed this
      • ...
      • setting.py
      • url.py
      • ...

      我的新admin.py

      my new 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

      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的输入!

      I guess the trick is catching the request in the admin.py file. Thanks solarissmoke for your input!

      这篇关于由创建和修改的Django模型保存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆