我必须更新"修改为"具有当前用户名称的模型中的字段。 通过这样的请求在视图中获取用户名非常容易:
request.user.username
但是,当使用shell修改模型的实例时(我有批量更新和处理条目的脚本),没有请求。
从请求(如果有)和shell进程获取当前用户名称的好方法是什么?
是的,我正在使用自定义save()方法。 它看起来像:
modified_by = "unknown user"
; 所以,我知道如何手动为字段分配值。 问题是如何知道某个特定事务是否在有或没有请求的情况下完成,如果没有请求(shell),则由哪个管理员/用户完成。
我尝试了什么:
将请求作为必需参数从任何视图传递到抽象模型,方法:它不起作用(至少,我不知道如何安全地编码所需参数和抽象模型的方法而不是视图中的普通功能);另外,我不知道如何从shell调用相同的方法时传递请求。
在shell中,我很容易得到User.objects.all()并尝试检查:如果用户已通过身份验证,则使用他/她的用户名,否则假设它是shell用户并手动分配&# 34; shell用户"值为"由"。
令我惊讶的是,任何返回的用户都在shell中进行了身份验证:
>>> users = User.objects.all()
>>> users
[<User: teddy>, <User: alexander>]
>>> users[0].is_authenticated()
True
>>> users[1].is_authenticated()
True
>>>
所以,这个简单的场景对我来说没有...
进一步思考:
save()
,因此此处的任何自定义逻辑都不起作用... 有什么想法可以提供帮助吗?
在保存模型时手动分配参数(who)的抽象类模型。
class ModifiedAwareModel(models.Model):
"""
ABC to keep track of when and by whom a model was created and updated.
"""
created_on = models.DateTimeField(_('created on'), blank=True, editable=False)
created_by = models.CharField(_('created by'), max_length=100, blank=True, editable=False)
modified_on = models.DateTimeField(_('modified on'), blank=True, editable=False)
modified_by = models.CharField(_('modified by'), max_length=100, blank=True, editable=False)
class Meta:
abstract = True
def save(self, who="Django", *args, **kwargs):
if not self.pk:
self.created_on = timezone.now()
self.created_by = who
self.modified_on = timezone.now()
self.modified_by = who
else:
self.modified_on = timezone.now()
self.modified_by = who
return super(ModifiedAwareModel, self).save(*args, **kwargs)
答案 0 :(得分:0)
使用Django shell
时,目前没有User
。解决此问题的方法是让使用shell的人手动将User
分配给modified by
字段。这个User
可能专门用于shell操作,但它不一定是这样的。另一种选择可能是为模型编写自定义save()
函数,如果您只是通过shell更改它。