我正在研究一個Web應用程序,它與所有具有唯一ID的實體一起工作。Python Django - 在視圖中訪問響應頭文件
我有一個用戶創建這些實體的提交表單,這個表單有幾個步驟(例如,視圖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」。
如果任何人都可以讓我知道如何在視圖中訪問響應的頭部,那看起來我們不能修改請求的頭部,這將是非常棒的。
感謝。
嗨,丹尼爾,非常感謝您的回覆。爲了澄清HttpResponseRedirect請求/響應循環,我認爲使用HttpResponseRedirect創建followin過程是正確的:1 /創建一個HttpResponse對象(請參閱django文檔)2 /創建另一個HttpRequest和HttpResponse(這將是重定向)。否則,我認爲你的建議是有道理的。謝謝。 – RobinW2
我不確定你在問什麼。正如我所說,從您的視圖返回重定向是一個指示瀏覽器請求另一個頁面;由於這是一個新的請求,因此在調用視圖時會獲取新的請求對象。 –
好的謝謝,這是有道理的。我會將上面的答案標記爲答案,因爲它解決了我的問題。 – RobinW2