2011-06-11 46 views
0

我有兩個相互關聯的模型。對於一個人爲的例子,第一個是一個事物列表,第二個是喜歡每個事物的人列表。這個記錄與我有關嗎?

我想顯示一個事物列表,如果我喜歡其中一個,然後在旁邊顯示一個圖標。

# in the models 
class Things(models.Model): 
    name = models.CharField(max_length = 100) 

class Likes(models.Model): 
    user = models.ForeignKey(User) 
    thing = models.ForeignKey(Thing) 

# in the view 
@login_required 
def list_of_things(request): 
    things = things.objects.all() 
    context = RequestContext(request, {'things': things}) 
    return render_to_response('thinglist.html', context) 

# in the template 
{% for thing in things %} 
<li>{{ thing.name }} 
    ## PSUEDO CODE HERE 
    {% if I've liked this thing %} 
    <img src="like.png"> 
    {% endif %} 
</li> 

我發現,在Python Shell中我可以這樣做:

>>> thing.likes_set.filter(user=user) 

得到我想要的東西,但我不知道在哪裏,上面的代碼我應該把這個。我想了一會兒,如果我添加了一個方法,我的東西模型,我可以在我的模板,這樣做:

{% if thing.liked_by_me %} 

但這需要模型知道用戶名。此外,它似乎不會是最好的表現。

有什麼建議嗎?

回答

1

在您的觀點中,爲了獲得最佳性能,您可以獲得您喜歡的東西和列表。

def list_of_things(request): 
    things = things.objects.all() 
    things_i_like = Like.objects.filter(user=current_user).values_list('things', flat=True) 
    context = RequestContext(request, {'things': things, 'things_i_like':things_i_like}) 
    return render_to_response('thinglist.html', context) 

values_list將只會選擇只有「東西」 平將壓平的QuerySet到列表

{% for thing in things %} 
<li>{{ thing.name }} 
    ## PSUEDO CODE HERE 
    {% if thing in things_i_like %} 
    ## IMAGE LINK 
    {% endif %} 
</li> 
{% endfor %} 

然後模板可以通過「東西」進行迭代,並檢查是否有一件事情是在'things_i_like'list

我沒有測試過這個,但它應該可以工作...

+0

謝謝,這照顧了它。我結束了這樣的代碼:'something_i_like = Likes.objects.filter(user = current_user).values_list('things__id',flat = False)'然後在我的模板中'如果thing.id in things_i_like'。我欣賞這個提示,從未使用過之前的values_list功能。 – newz2000 2011-06-11 23:08:15

相關問題