获取request.user对象

时间:2013-12-13 07:41:36

标签: python django model

是否可以在为模型定义的函数中获取request.user对象。例如:

class Event(models.Model):
   description = models.TextField()
   author = models.ForeignKey(User)

   def has_upvoted(self):
      return Up.objects.filter(user = self.request.user,
                          event = self.id)

我正在使用django的'User'模型,该模型允许'request.user'返回用户对象。是否可以在上述函数“ has_upvoted()”中获取它。此外,上述函数中使用的seconf过滤器采用“事件”模型本身的实例。我写的是错的。那么,有什么方法可以做到这一点吗?

3 个答案:

答案 0 :(得分:1)

我认为你只需要M2M领域进行投票。像这样:

class Event(models.Model):
    description = models.TextField()
    author = models.ForeignKey(User)
    voted_users = models.ManyToManyField(User, related_name='voted_events')

然后你可以使用它:

request.user.voted_events.all()

if specified_event in request.user.voted_events:
    print "%s up voted by %s" % (specified_event.description, request.user.username)

您的has_upvoted()方法并不是一个好主意。

答案 1 :(得分:0)

是的,但这不是很好,请看看:

https://djangosnippets.org/snippets/2179/

我不知道另一种方式

答案 2 :(得分:0)

模型可以在http请求/响应周期之外使用(管理命令等),因此您不能假设存在全局可用的request对象。为模型的方法提供“当前request.user”的唯一简洁方法是将其显式传递为参数。这也将使您的代码更易于测试和更强大。

class Event(models.Model):
   description = models.TextField()
   author = models.ForeignKey(User)

   # strange naming... looks like a predicate
   # but acts as a getter ???

   def has_upvoted(self, user):
      return Up.objects.filter(
          user=self.request.user,
          event=self.id)

然后在你看来:

def whatever(request, ...):
    event = get_your_event(...)
    ups = event.has_upvoted(request.user)

如果您需要从模板直接访问,则必须将调用包装在自定义模板标记或过滤器中,具体取决于has_upvoted实际应该是什么(谓词或访问者)

templatetag版本:

# yourapp/templatags/whatever.py
@register.assignement_tag
def has_upvoted(event, user):
    return event.has_upvoted(user)

然后

# yourtemplates/whatever.html

{% has_upvoted evt request.user as whatever %}
{{ whatever }}

有关自定义标记和过滤器的更多信息,请访问:https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/