Показывать разные баннеры при каждом клике пользователя на сайте django - PullRequest
0 голосов
/ 17 января 2012

У меня есть модель баннера

class SiteBanner( models.Model ):
   banner = models.FileField( storage=s3_storage, upload_to = 'banners/', null=True, blank=True )
   order = models.PositiveIntegerField ( default=0 ) 
   default = models.BooleanField ( default = False )

Я хочу показывать разные баннеры на каждом клике пользователя или на каждой странице сайта. Он будет отключен, когда я установлю default на True для баннера, тогда этот баннер будет отображаться на каждой странице. Это возможно? если да, то каким будет элегантное решение? cookies будет полезным для достижения этой цели?

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Сначала вам нужен контекстный процессор, чтобы получить баннер для вас:

# 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, чтобы он не повторялся, а затем мывернуть контекст с включенным баннером.

1 голос
/ 17 января 2012

(1) Каждая страница наследуется от шаблона, который отображает баннер.Узнайте о наследовании шаблонов здесь: https://docs.djangoproject.com/en/dev/topics/templates/#template-inheritance

(2) Используйте контекстный процессор для выбора баннера и вставьте его в контекст;то есть сделать его доступным как переменную внутри ваших шаблонов.Узнайте о процессорах контекста здесь: https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

Написание кода оставлено читателю в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...