【发布时间】:2013-10-27 18:01:15
【问题描述】:
我的问题是我需要知道用户是否对某个模型实例 BlogSite 进行了评分。在页面上,有多个 BlogSite 实例,它们具有 5 星评级系统。当前用户对某个实例进行评分后,应设置为只读。
我遇到了障碍,因为如果我使用模型函数,我需要传递 2 个变量 - current_user 和 BlogSite。我一直无法在 models.py 中找到如何访问 request.user 并且看起来我不应该这样做?
我走的另一条路是创建一个自定义过滤器 - 但我发现我只能传入一个参数。我宁愿不这样做,因为我觉得将逻辑保留在views.py中会更好
有人知道我该如何解决这个问题吗?
#models.py
class BlogSite(models.Model):
#fields
#get the average rating for a blogsite
def rating_avg(self):
rating_dict = BlogSiteReview.objects.filter(blog_site=self).aggregate(Avg('review_rating'))
rating_avg = rating_dict.get('review_rating__avg')
if rating_avg:
return rating_avg
else:
#no ratings
return 0
def rated(self, current_user):
#If there is a row for the blogsitereview with this blogsite for the logged in user, return True, else False
#can I access the current user? This does not work, seems like I can't get request here.
current_user = request.user
review = BlogSiteReview.objects.filter(blog_site=self, user=current_user)
if review:
return True
else:
return False
class BlogSiteReview(models.Model):
blog_site = models.ForeignKey(BlogSite)
user = models.ForeignKey(User)
#other fields
这是视图的相关部分:
#views.py
def search(request, type, regionValue):
#....
#ideally, the solution would be to have a field or function in the BlogSite model
blog_sites = BlogSite.objects.filter(country=region.id, active=True)
#....
在模板中,如果评级返回 True,我将有一个 if 语句来添加一个类
<tr>
<td><a href="http://{{ blogsite.url }}" id="{{ blogsite.id }}">{{ blogsite.site_name }}</a></td>
<td><div id="rating{{ blogsite.id }}" class="rating {% if blogsite.user_rated %}jDisabled{% endif %}" data-average="{{ blogsite.rating_avg }}" data-id="{{ blogsite.id }}"></div></td>
<td>{{ blogsite.create_date }}</td>
</tr>
我在这里寻找两件事 - 使用模型方法来获取用户是否评分似乎是正确的方法?到目前为止,我遇到的问题是我找不到如何访问当前用户以在 models.py 中使用。我想到的另一个想法是以某种方式从视图中传入 request.current_user ,但用户与 BlogSite 没有关联,所以我无法对其进行过滤。
【问题讨论】:
标签: python django django-models django-templates django-views