2011-10-06 3 views
2

django 튜토리얼 및 튜토리얼에서 wiki를 수행하고 있습니다. django의 이전 버전은 csrf 토큰이 필수가 아닌 곳에서 사용됩니다. {% csrf_token %}을 (를) 양식에 추가했지만보기에서 무엇을해야할지 모르겠습니다. 도와주세요.csrf_token 문제

다음은 폼의 :

<form method = "POST" action="/wikicamp/{{ page_name }}/save/">{% csrf_token %} 
    <textarea name = "content" rows="20" cols="60">{{ content }}</textarea><br/> 
    <input type="submit" value="Save Page"/> 
</form> 

views.py :

def view_page(request, page_name): 
    try: 
     page = Page.objects.get(pk=page_name) 
    except Page.DoesNotExist: 
     return render_to_response("create.html", {"page_name" : page_name}) 

    return render_to_response("view.html", {"page_name" : page_name, 
              "content" : page.content}) 

def edit_page(request, page_name): 
    c = {} 
    c.update(csrf(request)) 
    try: 
     page = Page.objects.get(pk=page_name) 
     contents = page.content 
    except Page.DoesNotExist: 
     content = "" 
    return render_to_response("edit.html", {"page_name" : page_name, 
              "content" : content}, c) 


def save_page(request, page_name): 
    content = request.POST["content"] 
    try: 
     page = Page.objects.get(pk=page_name) 
     page.content = content 
    except Page.DoesNotExist: 
     page = Page(name = page_name, content = content) 
    page.save() 

    return HttpResponseRedirect("/wikicamp/" + page_name + "/") 

여기에 오류 당신은 더 아무것도 할 필요가 없습니다

TypeError at /wikicamp/start/edit/ 
pop expected at least 1 arguments, got 0 
+0

오류를 지정하십시오. 그것은 내게 명확하지 않다 –

답변

3

단계 3을 충분히 이해하지 못했습니다. here : 컨텍스트 프로세서가 실행되도록하려면 RequestContext를 사용해야합니다.

return render_to_response("edit.html", {"page_name" : page_name, 
             "content" : content}, 
          context_instance=RequestContext(request)) 

이렇게하면 c.update(csrf(request)) 비트가 필요하지 않습니다.

0

에게 있습니다.

양식에 {% csrf_token %}을 입력하고 POST를 통해 보내십시오.

다른 모든 것들은 django.middleware.csrf.CsrfViewMiddleware 안에 있습니다.

당신은 당신의 settings.py (당신이하지 않은 경우)에서 활성화해야

: 당신이 당신의 템플릿 RequestContext (안 간단한 Context)를 사용하는 경우

MIDDLEWARE_CLASSES += (`django.middleware.csrf.CsrfViewMiddleware`,) 
TEMPLATE_CONTEXT_PROCESSORS += (`django.core.context_processors.csrf`,) 

마지막 라인이 필요하지 않습니다 (참고 : render_to_response()direct_to_template()RequestContext 인 경우 Context을 사용하십시오.

+0

작동하지 않습니다. csrf_token을 양식에 넣고 POST를 통해 보내면 여전히 "Forbidden (403) CSRF 확인에 실패했습니다. 요청이 중단되었습니다." – Marijus

+0

답변을 수정했습니다. 죄송합니다, 당신이'render_to_response()'를 사용하고 있다는 것을 눈치 채지 못했습니다. 그것은 까다로운 기능, 나는 그것에 비슷한 문제가 있었다. – Rost