我的問題是,我需要知道用戶是否對某個模型實例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)
#....
在模板中我將有一個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>
我在這裏尋找2件事情 - 使用模型方法來獲得用戶評分是否正確?到目前爲止,我遇到的問題是我無法找到如何訪問當前用戶在models.py中使用。我想到的另一個想法是以某種方式從視圖中傳遞request.current_user,但用戶不與BlogSite關聯,因此我無法對其進行過濾。
爲了完整起見,我添加了基於您的問題和答案源代碼的代碼示例,以說明我建議的操作。但是,您的方法(在您自己的答案中)可能更有效,因爲它只涉及一個數據庫查詢來獲取評級博客站點,而不是每個博客站點通過額定方法查詢一次。 – JayK