2017-02-04 58 views
0

我正在研究一個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」。

如果任何人都可以讓我知道如何在視圖中訪問響應的頭部,那看起來我們不能修改請求的頭部,這將是非常棒的。

感謝。

回答

0

你所要求的並不合理。響應是從Django發送到瀏覽器的內容,而不是瀏覽器發送給Django的內容。這是完全獨立的請求;在重定向的情況下,您的響應僅僅是一條指令,讓瀏覽器向新的URL發出請求。

正確的做法是使用會話,因爲你正在做。如果您擔心價值被持續存在,那麼您在使用時將其彈出會話:

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

嗨,丹尼爾,非常感謝您的回覆。爲了澄清HttpResponseRedirect請求/響應循環,我認爲使用HttpResponseRedirect創建followin過程是正確的:1 /創建一個HttpResponse對象(請參閱django文檔)2 /創建另一個HttpRequest和HttpResponse(這將是重定向)。否則,我認爲你的建議是有道理的。謝謝。 – RobinW2

+0

我不確定你在問什麼。正如我所說,從您的視圖返回重定向是一個指示瀏覽器請求另一個頁面;由於這是一個新的請求,因此在調用視圖時會獲取新的請求對象。 –

+0

好的謝謝,這是有道理的。我會將上面的答案標記爲答案,因爲它解決了我的問題。 – RobinW2