2016-06-13 64 views
0

我有一个网站,给你随机的笑话,问题是,有时它经常显示相同的笑话。我有一个笑话模型,我想保存这些笑话的id,并且对于每个访问者都要确保同一个笑话没有显示出来,比方说20个回合。但是,我怎样才能保存这些数据并传递给它们呢? 这里是我的观点:Python-Django:保存看到的项目,以便不再显示它们?

def random_good_joke_page(request): 
    """If asked for a random joke, redirect to joke's page.""" 
    return redirect('/jokes/%d/' % Joke.find_joke("Hot").id) 


def random_cold_joke_page(request): 
    """If asked for a random joke, redirect to joke's page.""" 
    return redirect('/jokes/%d/' % Joke.find_joke("Cold").id) 

现在,我需要保存已经显示出笑话的ID,并检查新的ID(从find_joke函数给出,这需要一个笑话评级,并返回一个随机适当的笑话) ,如果最近显示的笑话,选择一个新的ID,直到有一个还没有显示。我如何保存这些数据并将它们传递给Django?我想到了cookies,或者为Joke模型添加了这样的功能(虽然我不认为这是针对每个访问者的,但是对于所有人来说......)。这种情况是否有一些默认的实用方法?谢谢

回答

2

你可以存储在用户的会话看到笑话:

seen_joke_ids = request.session.get('seen_joke_ids', []) 
joke = Joke.objects.exclude(pk__in=seen_joke_ids).order_by('?')[0] 
seen_joke_ids.append(joke.pk) 
request.session['seen_joke_ids'] = seen_joke_ids[-20:] 

# your logic to display/redirect 
return redirect(reverse('joke', args=[joke.pk])) 
+0

只有一两件事:我怎么能在排除添加另一个条件?我只想得到评分=“热”的笑话,而不是评分=“冷”。除此之外,谢谢,我现在没有这样的事情... – Antoni4040

+1

只需链接查询集: 'qs = Joke.objects.exclude(pk__in = seen_joke_ids).filter(rating ='hot')' 或: 'qs = qs.filter(rating__in = ['hot','semi_hot'])'等。 – ohrstrom

+0

是的,我想通了...谢谢,很好! – Antoni4040

相关问题