由创建和修改的Django模型保存 [英] Django Model Save created by and modified by
问题描述
我正在运行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屋!