Сначала вам нужен контекстный процессор, чтобы получить баннер для вас:
# your_app/context_processors.py
def get_banner(request):
seen_banners = request.session.get('seen_banners', [])
try:
banner = SiteBanner.objects.exclude(pk__in=seen_banners, default=False).order_by('order')[0]
except IndexError:
if seen_banners:
del request.session['seen_banners']
try:
banner = SiteBanner.objects.exclude(default=False).order_by('order')[0]
except IndexError:
return {}
else:
return {}
else:
if seen_banners:
request.session['seen_banners'].append(banner.pk)
request.session.modified = True
else:
request.session['seen_banners'] = [banner.pk]
return {'banner': banner}
Свяжите это с настройкой settings.py TEMPLATE_CONTEXT_PROCESSORS
.Затем в каждом из ваших шаблонов у вас автоматически будет переменная banner
, которую вы можете использовать для доступа к баннеру для загрузки (при условии, что доступен хотя бы один баннер).
Контекстный процессор немного сложентак что я, вероятно, должен провести вас через это.Во-первых, он пытается получить список «увиденных» баннеров из сеанса.Затем это используется для исключения этих баннеров из набора запросов (чтобы один и тот же пользователь больше не получил тот же баннер).IndexError
произойдет, если не будет хотя бы одного доступного баннера, поэтому мы его поймаем.Если это потому, что пользователь уже видел их все, мы убиваем сеанс var и пытаемся снова получить баннер, не исключая его.В противном случае баннеры на самом деле недоступны, поэтому мы просто возвращаем пустой контекст.
Если мы можем получить баннер, то мы добавляем его идентификатор в сеанс var, чтобы он не повторялся, а затем мывернуть контекст с включенным баннером.