是否可以在为模型定义的函数中获取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过滤器采用“事件”模型本身的实例。我写的是错的。那么,有什么方法可以做到这一点吗?
答案 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)
答案 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/