首页 > 解决方案 > request.session 未保存或以某种方式修改

问题描述

尽管在更改值后使用,但似乎 myrequest.session没有保存或以其他方式进行了修改。request.session.modified = True

这是调试输出:

This should run first.
This should run second.
I have set main category to 2 (Shoes)
Main category is 1 (Books)

下面的代码应该根据所选类别显示不同的 ModelForm,但是当我选择例如 Books 时,会显示 ShoesModelForm,反之亦然。这目前的工作方式如下:每当更改组合框中的值时,都会触发两个 AJAX 请求。第一个调用一个视图(load_categories),如果一个类别有孩子,则呈现另一个,否则返回一个停止附加侦听器的 HttpResponse。load_modelform如果所选类别是根节点(主类别),则第二个调用呈现特定 ModelForm 的视图( )。

mappings = {
    '1': BookProductForm,
    '2': ShoesProductForm
}


def load_categories(request):
    print("This should run first.")
    category_id = request.GET.get('category')
    request.session['category'] = category_id
    request.session.modified = True
    if Category.objects.get(id=category_id).is_root_node():
        request.session['main_category'] = category_id
        request.session.modified = True
        print(f"I have set main category to {request.session['main_category']} ({Category.objects.get(id=category_id).name})")
    subcategories = Category.objects.get(id=category_id).get_children()
    if subcategories:
        return render(request, 'products/category_dropdown_list_options.html', {'subcategories': subcategories})
    return HttpResponse('leaf_node')


def load_modelform(request):
    print("This should run second.")
    main_category = request.session['main_category']
    print(f"Main category is {main_category} ({Category.objects.get(id=main_category).name})")
    form = mappings[main_category]
    return render(request, 'products/category_modelform.html', {'form': form})


@login_required
def product_create_view(request):
    if request.method == 'POST':
        category = request.session.get('main_category')
        create_product_form = mappings[category](request.POST)
        if create_product_form.is_valid():
            create_product_form.save()
    return render(request, 'products/product_create.html', {
        'categories': Category.objects.filter(parent=None)
    })

这里可能发生了什么?

@编辑:

我将我的模板包含在包含 Ajax 请求的 jQuery 代码中:

{% extends 'pages/base.html' %}

{% load static %}

{% block cssfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'products/css/create.css' %}">
{% endblock %}

{% block content %}
<h1>Create a product</h1>
<div class='modelform'>
  <form method='POST' id='productForm' data-products-url="{% url 'products:ajax_load_categories' %}" data-modelform-url="{% url 'products:ajax_load_modelform' %}">
      {% csrf_token %}
      <div class='categories'>
          <label>Category</label>
          <select>
              {% for category in categories %}
              <option value="{{ category.pk }}">{{ category.name }}</option>
              {% endfor %}
          </select>
      </div>
      <div class='the-rest'>
      {{ form.non_field_errors }}
      {% for field in form %}
          {% ifnotequal field.name 'category' %}
              {{ field.label_tag }}  {{ field }} 
              {{ field.errors }}
          {% endifnotequal %}
      {% endfor %}
      </div>
      <input type="submit" name="" value="Submit">
  </form>
</div>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
    var $r_ = function() {
        var url = $("#productForm").attr("data-products-url");
        var categoryId = $(this).val();
        var toRemove = $(this).nextAll('select');

        $.ajax({                       
          url: url,                    
          data: {
            'category': categoryId
          },
          success: function (data) {
            if (data != 'leaf_node') {
              toRemove.remove();
              $(".categories").append(data);
            }
            else {
              toRemove.remove();
            }
          }
        });

        var url2 = $('#productForm').attr('data-modelform-url');

        setTimeout(function() {
          $.ajax({                       
            url: url2,                    
            data: {
              'category': categoryId
            },
            success: function (data) {
              if (data != 'dont_change_modelform') {
                $('.the-rest').empty();
                $('.the-rest').append(data);           
              }
            }
          });
        }, 100);
    }
    $(document).on('change', 'select', $r_);
</script>
{% endblock %}

标签: pythondjango

解决方案


推荐阅读