Django request.session не передает измененные данные сеанса в шаблон / другие представления - PullRequest
0 голосов
/ 04 августа 2020

Привет, я новичок в структуре Django, и я столкнулся с этой проблемой в своем проекте магазина. Вот то, что я использовал request.session для хранения данных корзины, и я хотел очистить резервирование пользователей через некоторое время после того, как клиент выберет товар.

# Interacts with the database
def configure_db(chosen, item_id, quantity=1):
    item = Item.objects.filter(id=item_id)
    if chosen:
        item.update(reservation=F('reservation') + quantity)
    if not chosen:
        item.update(reservation=F('reservation') - quantity)

# Main cart handler 
def cart_manager(request):
    data = json.loads(request.body)
    itemId = int(data['itemId'])
    action = data['action']
    stock = int(data['stock'])
    

    def clear_reservation(item_id):
        for item in request.session['cart_items']:
            if item_id == item['id']:
                item['quantity'] -= 1
                print("reservation cleared")

    if request.session.has_key('cart_items'):
        cart_items = request.session['cart_items']
        for item in cart_items:
            if itemId == item['id']:
                if action == 'add' or action == 'increase':
                    reservation = Item.objects.get(id=itemId).reservation
                    if int(reservation) < stock:
                        item['quantity'] += 1
                        request.session['cart_quantity'] += 1
                        configure_db(True, itemId)
                        Timer(5.0, clear_reservation, [itemId]).start()

    return JsonResponse("foo", safe=False)

Вот мой Javascript

function editCart(itemId, action, stock) {
  let csrftoken = getCookie("csrftoken");
  let itemData = JSON.stringify({
    itemId: itemId,
    action: action,
    stock: stock,
  });
  fetch("http://127.0.0.1:8000/shop/editcart", {
    method: "POST",
    body: itemData,
    headers: new Headers({
      "content-type": "application/json",
      "X-CSRFToken": csrftoken,
    }),
  })
    .then((res) => {
      return res.json();
    })
    .then((data) => {
        location.reload();
    });
}

Я обновлялся каждый раз, чтобы обновить информацию о клиентах на странице, но мой шаблон не знает об изменениях, сделанных функцией def cart_manager(request):. Вот часть HTML, которую я использую для отображения количества товара в тележке в магазине

{% for item in all_items %}
<div class="item">
  <div class="item-name">{{ item.name }}</div>
  <div class="cart-data">
    <div>You: {% for cart in request.session.cart_items %}
              {% if cart.id == item.id %}{{cart.quantity}}{% endif %}
              {% endfor %}</div>
  </div>
</div>
{% endfor %}

Также, если это полезно, представление обрабатывается классом ниже, и я думаю, что это представление также не в курсе изменений. Заранее спасибо !!

class ItemPage(generic.DetailView):
    model = Category
    template_name = 'shop/shopitems.html'
    context_object_name = 'category'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        category = context['category']
        context['all_items'] = category.item_set.all()
        return context
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...