2012-02-15 3 views
5

내 웹 페이지에서 일부 아약스 요청 후 데이터로 채워지는 양식이 있습니다. 예를 들어 사용자가 목록에서 항목을 선택하면 항목이 선택되었지만 아직 확인되지 않은 간단한 Ajax 요청이 데이터베이스로 전송됩니다. 그런 다음 웹 페이지의 목록이 새 항목 목록을 가져 오기 위해 simpe ajax 요청 (전체 페이지가 아닌 목록 만)을 사용하여 다시로드됩니다.django, 양식 POST 제출 후 이전 페이지로 돌아 가기

나는 이것이 다소 고전적인 카트 구현이라고 생각합니다.

그러나 사용자가 전체 목록을 확인하기 위해 submit (기본 양식 POST 제출, 구현과 관련된 이유로 아약스 POST가 아님)을 누르면 현재 페이지로 돌아가고 싶습니다. (현재 페이지가 다릅니다.) 가능합니까? 나는 장고를 사용하고있다.

감사합니다.

답변

11

당신은 next GET 매개 변수를 제공 할 수 있습니다, 유사한이의 django.contrib.auth하는 login() 방법 :

https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login :

<form action="/url/to/post/form/?next={{ some_variable }}"> 

변수는 단순히 현재의 URL 될 수있다 (촬영 요청에서) 또는 생성 된 URL. 양식을 처리하는 관점에서, 단순히 next 매개 변수를 확인하고 적절하게 재 :

from django.shortcuts import redirect 
if 'next' in request.GET: 
    return redirect(request.GET['next']) 
0

현재 페이지는 매우 모호하지만 나는 폼 페이지로 참조 된 페이지를 원한다고 가정합니다. 이는 일반적으로 항상 (항상은 아님) 요청 자체의 HTTP_REFERRER 헤더에 저장됩니다. 요청에서 가져 와서 리디렉션을 시도 할 수 있습니다. 양식을 제출하면

+0

대단히 감사합니다. 당신은 "항상 그렇지는 않다"고 말하는 이유는 무엇입니까? – xpanta

+2

리퍼러를 보내는 것은 사용자의 브라우저에 달려 있습니다. 일부 브라우저는 Opera를 사용하지 못하도록 설정하거나 옵션을 사용할 수 없습니다. 또 다른 해결 방법은 양식에 숨겨진 입력 값으로 현재 경로를 포함시키고'request.POST'에서 그 값을 검색하는 것입니다. – AdamKG

1

당신은 포스트/리디렉션/가져 오기 디자인 패턴 (PRG)를 사용할 수 있습니다. Post/Redirect/Get에 대한보다 일반적인 정보는 다음을 참조하십시오 : http://en.wikipedia.org/wiki/Post/Redirect/Get 좋은 프로세스 흐름 다이어그램이 있습니다.

다음과 같이 보일 수 있습니다 PRG를 구현하는보기의 일반적인 예 : 당신은 GET과 더 흥미로운 무언가를해야하는 경우, reverse는 인수와 kwargs로 걸릴 수 있습니다

# urls.py 
urlpatterns = patterns('', 
    url(r'^/$', views.my_view, name='named_url'), 
) 

# forms.py 
class MyForm(forms.Form): 
    pass # the form 

# views.py 
def my_view(request, template_name='template.html'): 
    """ Example PostRedirectGet 
    This example uses a request context, but isn't 
    necessary for the PRG 
    """ 
    if request.POST: 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      try: 
       form.save() 
       # on success, the request is redirected as a GET 
       return HttpResponseRedirect(reverse('named_url')) 
      except: 
       pass # handling can go here 
    else: 
     form = MyForm() 

    return render_to_response(template_name, { 
     'form':form 
    }, context_instance=RequestContext(request)) 

. 보기 params, url_pattern 및 reverse call을 조작하여보고자하는 결과를 표시하십시오.

추가로 한 가지주의 할 점은 동일한보기로 리디렉션 할 필요가 없다는 것입니다 (이 예와 같이). 사용자를 리디렉션하려는 모든 명명 된보기가 될 수 있습니다.

관련 문제