【问题标题】:What is the user's username?用户的用户名是什么?
【发布时间】:2010-03-09 22:26:31
【问题描述】:

在我的一个 Django 模型中,我覆盖了保存功能。我这样做是为了获取用户的用户名。但这总是失败。

这就是我所做的:

    def save(self, *args, **kwargs):
    self.slug = slugify('%s' % (self.question))
    if not self.id:
        self.publish_date = datetime.datetime.now()
        self.publisher = self.request.user
    self.modification_date = datetime.datetime.now()
    self.modifier = self.request.user
    super(Faq, self).save(*args, **kwargs) # Call the "real" save() method

这失败了: 'Faq' 对象没有属性 'request'

谢谢。

【问题讨论】:

  • 请发布完整的模型类。
  • 发布的代码不会引发该错误,因为您没有在任何地方引用全局request。所以,要么那不是你实际使用的代码,要么回溯实际上引用了不同的代码。
  • 对不起。这是原始代码。我复制了这个,然后想通过删除“自我”来做出改变。我这样做并重新加载了页面,然后返回了该错误。
  • 我已经用“正确”的错误消息更新了帖子。谢谢。

标签: django django-models


【解决方案1】:

如果这是在 Admin 应用程序中使用,正如您在对 Jake 的回答中所说,那么您根本不应该覆盖模型保存方法。相反,您应该覆盖ModelAdmin 类的save_model 方法。

查看django.contrib.admin.options 中的原始代码 - 你会看到它已经传递了request 对象。所以你需要做的就是在那里分配publisher

def save_model(self, request, obj, form, change):
    obj.slug = slugify('%s' % (obj.question))
    if not obj.id:
        obj.publish_date = datetime.datetime.now()
        obj.publisher = request.user
    obj.modification_date = datetime.datetime.now()
    obj.modifier = request.user
    obj.save()

【讨论】:

  • 感谢丹尼尔指出这一点! :) 并且,为了提供解决方案。只是为了我的理解,最后调用 save_model 方法。 obj.save()。保存调用是在 model.py 中指定的调用。是的?感谢所有回复的人。 :)
  • 实际上,我继续测试它...在 save_model 覆盖中,我只有 obj.save(request) 行和 models.py 中的 save override 我从 self.request.user 更改请求用户。这很好用。所以,如果我从视图中保存,我将拥有我想要的功能。 :) 再次感谢。
  • 太好了,杰克,谢谢你的建议。显然比我有更好的解决方案。 :)
【解决方案2】:

request 仅传递给视图,而不是模型方法,因此您必须在视图中设置 publisher

我会从此处删除行 self.modifier = self.request.user 并在设置 question 的同时设置 modifier = request.user,我假设您正在视图中执行此操作。

那你可以把self.publisher = self.request.user改成self.publisher = self.modifier

希望对您有所帮助。

【讨论】:

  • 谢谢杰克。问题在于这是来自管理部分。
【解决方案3】:

您需要将请求传递给 save 方法,因为它不会自动存在于该上下文中。

def save(self, request, *args, **kwargs):
    self.slug = slugify('%s' % (self.question))
    if not self.id:
        self.publish_date = datetime.datetime.now()
        self.publisher = request.user
    self.modification_date = datetime.datetime.now()
    self.modifier = self.request.user
    super(Faq, self).save(*args, **kwargs) # Call the "real" save() method

用法...

my_faq = Faq()
my_faq.save(request)

【讨论】:

  • 亚当,这是从管理部分完成的。因此,我认为我无法选择将请求与呼叫一起发送。
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 2020-02-07
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2011-07-14
  • 2016-02-08
相关资源
最近更新 更多