2011-08-25 136 views
0

不知道如何解决这个问题:/。Django:CSRF验证失败

views.py:

# coding: utf-8 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from django.views.generic.simple import direct_to_template 
from django.core.mail import send_mail 
from django.template import Context, loader 
from django.conf import settings 
from sklep.models import Produkt 
from sklep.forms import ZamowienieForm 
from django.core.context_processors import csrf 

def koszyk(request): 
    koszyk = request.session.get('koszyk', []) 
    produkty = list(Produkt.objects.filter(pk__in=koszyk)) 

    if request.method == 'POST': 
     formularz = ZamowienieForm(request.POST) 

     if formularz.is_valid(): 
      dane = formularz.cleaned_data 
      tresc = loader.get_template('sklep/zamowienie.txt').render(Context({'produkty': produkty, 'dane': dane})) 

      send_mail('Potwierdzenie zakupu', tresc, settings.EMAIL_SKLEPU, [dane['email']]) 
      send_mail(u'Zamówienie', tresc, dane['email'], [settings.EMAIL_SKLEPU]) 

      del request.session['koszyk'] 

      return HttpResponseRedirect(reverse('sklep_koszyk')) 
    else: 
     formularz = ZamowienieForm() 

    if koszyk: 
     kontekst = {'koszyk': produkty, 'formularz': formularz} 
    else: 
     kontekst = {'koszyk': []} 

    return direct_to_template(request, 'sklep/koszyk.html', extra_context = kontekst) 

def koszyk_dodaj(request, id_produktu): 
    koszyk = request.session.get('koszyk', []) 
    if int(id_produktu) not in koszyk: 
     koszyk.append(int(id_produktu)) 
    request.session['koszyk'] = koszyk 
    return HttpResponseRedirect(reverse('sklep_koszyk')) 

forms.py

# coding: utf-8 
from django import forms 
from django.contrib.localflavor.pl.forms import PLPostalCodeField 

class ZamowienieForm(forms.Form): 
    email = forms.EmailField() 
    imie_nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=60) 
    adres = forms.CharField(max_length=100) 
    kod_pocztowy = PLPostalCodeField() 
    miasto = forms.CharField(max_length=60) 
    uwagi = forms.CharField(widget=forms.Textarea, required=False) 

回答

1

这个问题可能是在您的模板SKLEP/koszyk.html。在html页面的表单内部,您需要包含{% csrf_token %}documentation有关于此功能的更多信息。

0

此外,要添加到murgatroid99所说的内容,您需要在调用该页面时包含csrf(请求)。我通常做一个locals()。update(csrf(request)),然后用locals()作为全局字典参数调用页面。