Задать вопрос
vikkyshostak
@vikkyshostak
< This head full of dreams.

Как добавить начальные значение cookies при первом посещении сайта?

Доброго времени!

Django 2.x. Хочу при первом посещении сайта добавлять некоторые параметры в куки (значение валюты сайта по умолчанию). Делаю, через middleware во так:

# /app/middlewares.py

class CurrencyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        if not request.COOKIES.get('currency'):  # проверяю куку, если нет, то добавляем
            response.set_cookie('currency', 'dollar', max_age=1000)

        return response

В файл настроек добавляю эту миддлвару:

# /app/settings.py

MIDDLEWARE = [
    ...
    'app.middlewares.CurrencyMiddleware',
]

В шаблоне прописал select, где по клику на option — эта кука должна меняться на передаваемое значение в функцию (Vue.js + vue-cookies за это отвечает). Использую CSS фреймворк Bulma:

// /templates/header.html

<div class="dropdown-menu switcher" id="dropdown-menu" role="menu">
  <div class="dropdown-content">
    {% if request.COOKIES.currency != 'euro' %}
      <a @click="changeCurrency('euro')" class="dropdown-item">
        <span class="icon"><i class="fas fa-euro-sign"></i></span>
        <span>{% trans 'Euro' %}</span>
      </a>
    {% endif %}
    {% if request.COOKIES.currency != 'dollar' %}
      <a @click="changeCurrency('dollar')" class="dropdown-item">
        <span class="icon"><i class="fas fa-dollar-sign"></i></span>
        <span>{% trans 'Dollar' %}</span>
      </a>
    {% endif %}
    {% if request.COOKIES.currency != 'ruble' %}
      <a @click="changeCurrency('ruble')" class="dropdown-item">
        <span class="icon"><i class="fas fa-ruble-sign"></i></span>
        <span>{% trans 'Ruble' %}</span>
      </a>
    {% endif %}
  </div>
</div>

// /static/js/script.js

import Vue from 'vue'
import VueCookies from 'vue-cookies'

Vue.use(VueCookies)

const switcher = new Vue({
  el: '.switcher',
  methods: {
    changeCurrency: function (cur) {
      if (this.$cookies.isKey('currency')) { // проверка на наличие куки
        this.$cookies.remove('currency') // если есть, то удаляем старую куку
      }
      
      this.$cookies.set('currency', cur) // задаём новую куку
      location.reload() // перезагружаем страницу
    }
  }
})

Этот свитчер валют сквозной, то есть на каждой странице он есть и (по идее) должен везде работать одинаково. Но, по какой-то неведомой причине, на некоторых страницах — свитчер не заменяет куку при клике, а добавляет новую и меняет только её значение (как будто бы дубля нет)! Вот:

5a7d6356a72f6052256899.png

Эти страницы — обычные вьюхи, где делается get по queryset модели. Например:

class PayOrderView(LoginRequiredMixin, View):
    """
    Pay Order by ID
    """

    template_name = 'orders/orders_payment_choose.html'

    def get(self, request, order_id):
        # Get Orders object
        order = BasicOrder.objects.get(id=order_id)

        if request.user.id == order.user.id:
            return render(request, self.template_name, {'order': order})

        return Http404

Подскажите, как быть? Может быть я что-то не то делаю?
Буду рад толковым комментариям!
  • Вопрос задан
  • 185 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы