我正在使用一个Web应用程序,该应用程序可与具有唯一ID的实体一起使用。

我有一个供用户创建这些实体的提交表单,此表单分几个步骤进行(即,视图1重定向到视图2等,直到提交过程结束)。

提交表单后,第一个视图将创建实体的ID,然后我需要使用在其他视图中创建的实例的ID。

我不想将此ID作为URL参数传递给其他视图,因为它们将是POST,这意味着用户可以轻松地操纵它们并在模型中为多个ID创建记录。我已经设法使用会话参数(request.session)将此ID传递给多个视图,但这并不理想,因为这对于会话是永久的。当前代码如下:

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})


理想情况下,我想在响应的标头中传递此ID参数,因为这样可以避免将ID作为会话参数。因此,我将代码修改为以下内容:

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})


但是上述方法不起作用,并且错误消息似乎表明响应头中没有“ xxx_id”。

如果有人可以让我知道如何在视图中访问响应的标头,那就太好了,因为似乎我们无法修改请求的标头。

谢谢。

最佳答案

您要问的没有任何意义。响应是从Django发送到浏览器的响应,而不是浏览器发送到Django的响应。那是一个完全独立的请求;在重定向的情况下,您的响应只是向浏览器发出的向新URL发出请求的指令。

正确的做法是像您一样使用会话。如果您担心该值会被保留,请在使用它时将其从会话中弹出:

xxx_id = request.session.pop('property_id')

关于python - Python Django- View 中的访问响应头,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42040119/

10-16 21:39