python - 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 %}
解决方案
推荐阅读
- sql-server - 查找字符串和日期时间差异
- android - 如何在 Android 的地图视图中显示 .KML 文件
- calendar - 如何根据关键字批量删除谷歌日历上的事件?
- php - 如何连接 Propel 中没有定义外键的两个表?
- php - Laravel 注销创建会话超时
- linux - 错误:服务“xxx”使用未定义的网络“xxx”
- pagination - 带有重复输入错误的codeigniter中的分页
- android - FusedLocationClient 未调用 onLocationResult
- html - btn-group 创建第一个按钮太高
- google-assistant-sdk - 使用 Google Assistant 添加人声控制