Как ограничить счетчик лайков на основе куки пользователя, а не вошедшего в систему пользователя? - PullRequest
0 голосов
/ 03 мая 2019

Я использую Intercooler.js для небольшого счетчика.В основном это просто поле IntegerField в модели Django с именем value, и тогда вся логика обрабатывается в виде, подобном следующему:

from django.shortcuts import render
from .models import Counter


def index(request, template_name="counter.html"):
    if request.GET.get('ic-request'):
        counter, created = Counter.objects.get_or_create(pk=1)
        counter.value += 1
        counter.save()
    else:
        counter, created = Counter.objects.get_or_create(pk=1)
        print(counter.value)
    context = dict(
        value=counter.value,
    )
    return render(request, template_name, context=context)

В шаблоне вы пишете его как HTML, безодна строка JavaScript:

<button ic-get-from="{% url 'index' %}" ic-target="#wrapper" ic-select-from-response="#wrapper" class="btn btn-success btn-sm my-2 mr-1" ><i class="fe-icon-heart"></i>&nbsp;<div id="wrapper">Like {{ value }}</div></button>

Так что это круто.Однако сейчас вы можете просто нажать кнопку «Нравится» навсегда.Есть ли какой-нибудь способ добавить немного (JavaScript), чтобы ограничить количество лайков на основе файлов cookie пользователя, а не пользователя, вошедшего в систему?Но все еще использую Intercooler.js

1 Ответ

0 голосов
/ 03 мая 2019

Вы можете установить что-то на request.session, которое скажет вам, понравилось это или нет; в противном случае вы можете использовать куки-файлы и использовать их в любое время:

def index(request, template_name="counter.html"):
    already_liked = request.session.get('already_liked')
    counter = Counter.objects.filter(pk=1).first() # i don't want to add try/except now
    if not already_liked:
        if request.GET.get('ic-request'):
            if counter:
                counter.value += 1
                counter.save()
                request.session['already_liked'] = True
            else:
                counter, created = Counter.objects.get_or_create(pk=1)
                counter.value += 1
                counter.save()
                request.session['already_liked'] = True
         else:
             counter, created = Counter.objects.get_or_create(pk=1)
             request.session['already_liked'] = True # duplicating this because I don't have a full overview of your project
    if counter:
        value = counter.value # not sure what are the whole expectations of this flow
    else:
        value = 0 # so we return something on context
    context = dict(
        value=counter.value,
    )
    return render(request, template_name, context=context)
...