2013-08-01 99 views
1

我試圖獲得POST方法在Python中使用Django。但CSRF實施無法成功。Django Form Post

這裏是我的URL模式是

url(r'^showTime/$', showTime), 
    url(r'^$', showTime), 
    url(r'^showWeekEnd/$', showWeekEnd), 

我也使我在我Views.py

def showTime(request):  
    t = get_template('FR/current_datetime.html') 
    htmlContent = t.render(Context({"day_list": ['wednesday','thursday','friday'] , "current_date": datetime.datetime.now()})) 
    return HttpResponse(htmlContent) 

def showWeekEnd(request):   
    c = {} 
    c.update(csrf(request)) 
    if request.method == 'POST': 
     return render_to_response('EN/current_datetime.html', c) 

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware', 
) 

我有(EN/current_datetime.html )

<form action="/showWeekEnd/" method="post">{% csrf_token %} 

對於這個我越來越

TypeError: csrf() takes exactly 1 argument (0 given) 

如果我必須要通過更多的參數,這個錯誤,當我啓動應用程序本身帶有即時得到「服務器出現錯誤。請聯繫管理員。」

請解釋什麼地方出了錯?

+0

這是什麼? 'c = {}; c.update(csrf(request))' – rednaw

回答

0

這樣做:

#settings.py 
TEMPLATE_CONTEXT_PROCESSORS = (
    ..., 
    'django.core.context_processors.csrf',) 

在您的視圖中,使用csrf裝飾器而不是手動添加它。

from django.views.decorators.csrf import csrf_protect 
from django.template import RequestContext 

@csrf_protect 
def showWeekEnd(request): 
    c = RequestContext(request) 
    return render_to_response('EN/current_datetime.html', c) 
1

你有沒有嘗試在您的加選擇render_to_response RequestContext的(要求)?

views.py

from django.template import RequestContext 

return render_to_response('EN/current_datetime.html', c, RequestContext(request)) 
+0

YES我也試過。此外,我有一種感覺,它甚至沒有來編碼部分。 – syv

+0

在POST之前嘗試在GET請求中傳遞RequestContext。 – adamr

+0

我還注意到了一件事,我得到這個錯誤時刻,我在「MIDDLEWARE_CLASSES」中啓用了這個「django.core.context_processors.csrf」。 – syv

1
from django.shortcuts import render 
import datetime 

def showWeekEnd(request):   
    if request.method == 'POST': 
     return render(request, 'EN/current_datetime.html') 

def showTime(request):  
    c = {} 
    c["day_list"] = ['wednesday','thursday','friday'] 
    c["current_date"] = datetime.datetime.now() 
    return render(request, 'FR/current_datetime.html', c) 
+0

謝謝!我注意到這一點,我剛剛在「MIDDLEWARE_CLASSES」中評論了「'django.middleware.csrf.CsrfViewMiddleware'」,並嘗試使用相同的代碼。那麼如何處理CSRF令牌? – syv

+0

@ Burhan Khalid我找到了原因。如果我評論django.middleware.csrf.CsrfViewMiddleware,那麼將不會進行驗證。謝謝 !! – syv