2017-02-04 1 views
0

나는 모든 고유 ID를 가진 엔티티와 작동하는 웹 응용 프로그램에서 작업하고 있습니다.Python Django - 액세스 응답 헤더보기에서

사용자가이 엔티티를 만들 수있는 제출 양식이 있으며이 양식은 여러 단계 (제출 프로세스가 완료 될 때까지보기 1에서보기 2로 리디렉션되는 등)입니다.

첫 번째보기는 양식 제출 후 엔티티의 ID를 작성한 다음 다른보기에서 작성된 인스턴스의 ID를 사용해야합니다.

이 ID는 URL 매개 변수로 다른보기에 전달하지 않으므로 POST가되며 사용자가 여러 ID에 대해 모델에서 레코드를 쉽게 만들 수 있습니다. 이 ID를 세션 매개 변수 (request.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}) 

적으로는, 내가 세션 매개 변수로 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