首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取request.user对象

获取request.user对象
EN

Stack Overflow用户
提问于 2013-12-13 07:41:36
回答 3查看 623关注 0票数 0

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

代码语言:javascript
复制
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()'.中可以得到它吗?另外,上面函数中使用的第二个过滤器接受'Event‘模型本身的一个实例。我写的是错的。那么,怎样才是正确的方法呢?

EN

回答 3

Stack Overflow用户

发布于 2013-12-13 08:04:01

我想你只是需要M2M字段来投票。就像这样:

代码语言:javascript
复制
class Event(models.Model):
    description = models.TextField()
    author = models.ForeignKey(User)
    voted_users = models.ManyToManyField(User, related_name='voted_events')

然后你可以使用它:

代码语言:javascript
复制
request.user.voted_events.all()

代码语言:javascript
复制
if specified_event in request.user.voted_events:
    print "%s up voted by %s" % (specified_event.description, request.user.username)

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

票数 1
EN

Stack Overflow用户

发布于 2013-12-13 07:44:08

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

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

我不知道还有别的办法

票数 0
EN

Stack Overflow用户

发布于 2013-12-13 07:55:53

模型可以在http请求/响应周期(管理命令等)之外使用,因此您不能假设存在一个全局可用的request对象。使“当前request.user”对您的模型方法可用的唯一干净方法是显式地将它作为参数传递。这也将使您的代码更易测试,更健壮。

代码语言:javascript
复制
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)

那么在你看来:

代码语言:javascript
复制
def whatever(request, ...):
    event = get_your_event(...)
    ups = event.has_upvoted(request.user)

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

模板版:

代码语言:javascript
复制
# yourapp/templatags/whatever.py
@register.assignement_tag
def has_upvoted(event, user):
    return event.has_upvoted(user)

然后

代码语言:javascript
复制
# yourtemplates/whatever.html

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

有关自定义标记和筛选器的更多信息,请在这里:https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20561432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档