是否可以在为模型定义的函数中获取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()'.中可以得到它吗?另外,上面函数中使用的第二个过滤器接受'Event‘模型本身的一个实例。我写的是错的。那么,怎样才是正确的方法呢?
发布于 2013-12-13 08:04:01
我想你只是需要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()方法不是个好主意。
发布于 2013-12-13 07:44:08
发布于 2013-12-13 07:55:53
模型可以在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 (谓词或访问器)
模板版:
# 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/
https://stackoverflow.com/questions/20561432
复制相似问题