我正在开发一个 Web 应用程序,该应用程序与所有具有唯一 ID 的实体一起使用。
我有一个提交表单,供用户创建这些实体,该表单分为几个步骤(即 View 1 重定向到 View 2,等等......直到提交过程结束)。
第一个 View 将在表单提交后创建实体的 ID,然后我需要使用在其他 View 中创建的实例的 ID。
我不想将此 ID 作为 URL 参数传递给其他 View ,因为这些 View 将是 POST,这意味着用户可以轻松地操作这些 View 并在模型中为多个 ID 创建记录。我已经设法使用 session 参数(request.session)将此 ID 传递给多个 View ,但这并不理想,因为这对于 session 来说是永久的。当前代码如下:
def view1(request):
if request.method == 'POST':
form = xxx_creation_form(request.POST)
if form.is_valid():
cleaned_form_data = form.cleaned_data
xxx_entry = Model.objects.create(
... object creation ...
)
request.session['xxx_id'] = xxx_entry.id
return HttpResponseRedirect(reverse('form_2'))
else:
form = xxx_creation_form()
return render(request, 'xxx_form.html', {'form': form})
def view2(request):
xxx_id = request.session['property_id']
if xxx_id == 'SET_BACK_BLANK':
return render(request, 'no_xxx_id.html')
if request.method == 'POST':
form = xxx_form2(request.POST)
if form.is_valid():
cleaned_form_data = form.cleaned_data
xxx_entry = Model.objects.create(
id = xxx_id, #use the id created in step 1
... rest of object creation ...
)
request.session['xxx_id'] = 'SET_BACK_BLANK' #to avoid the misuse during other user interactions.
return HttpResponseRedirect(reverse('thanks'))
else:
form = xxx_form2()
return render(request, 'xxx_form2.html', {'form': form})
理想情况下,我想在响应的 header 中传递此 ID 参数,因为这样可以避免将 ID 作为 session 参数。所以我将代码修改为以下内容:
def view1(request):
if request.method == 'POST':
form = xxx_creation_form(request.POST)
if form.is_valid():
cleaned_form_data = form.cleaned_data
xxx_entry = Model.objects.create(
... object creation ...
)
response = HttpResponseRedirect(reverse('form_2'))
response['xxx_id'] = xxx_entry.id
return response
else:
form = xxx_creation_form()
return render(request, 'xxx_form.html', {'form': form})
def view2(request):
xxx_id = HttpResponseRedirect(request).__getitem__('xxx_id')
if request.method == 'POST':
form = xxx_form2(request.POST)
if form.is_valid():
cleaned_form_data = form.cleaned_data
xxx_entry = Model.objects.create(
id = xxx_id, #use the id created in step 1
... rest of object creation ...
)
return HttpResponseRedirect(reverse('thanks'))
else:
form = xxx_form2()
return render(request, 'xxx_form2.html', {'form': form})
但是上面的方法不起作用,错误消息似乎表明响应 header 中没有“xxx_id”。
如果有人能让我知道如何在 View 中访问响应的 header ,那就太好了,因为我们似乎无法修改请求的 header 。
谢谢。
最佳答案
你问的根本没有意义。响应是从 Django 发送到浏览器的内容,而不是浏览器发送到 Django 的内容。这是一个完全独立的请求;在重定向的情况下,您的响应只是指示浏览器向新 URL 发出请求。
正确的做法是使用 session ,就像您正在做的那样。如果您担心该值会被持久化,请在使用时将其从 session 中弹出:
xxx_id = request.session.pop('property_id')
关于Python Django - 在 View 中访问响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040119/