2012-10-05 21 views
5
$.ajax({ 
    url:'/', 
    type: "POST", 
    data: {name: 'name', age: 'age'}, 
    success:function(response){}, 
    complete:function(){}, 
    error:function (xhr, textStatus, thrownError){} 
}); 

I views.py:Django jQuery żądanie po

class SomeView(generic_views.TemplateView): 
    template_name = 'something.html' 

    def get(self, request, *args, **kwargs): 
     ...something... 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     name = request.POST['name'] 
     age = request.POST['age'] 
     ...something... 

I otrzymujemy: [05/lis/2012 12:03:58] "POST/coś/HTTP/1.1" 403 2294

Chciałbym wysłać te dane (imię i wiek) przez jQuery do tej funkcji posta w "SomeView". Jest to ten sam widok, co załadowany szablon, tylko typ żądania jest inny. Po pobraniu() szablonu i postu, funkcja post() powinna zostać wywołana. Czy to możliwe? Sprawdziłem inne pytania i otrzymałem to rozwiązanie. To miało działać. Co ja robię źle?

Odpowiedz

8

Odpowiedź na pytanie, co robisz źle, jest : niewiele!

Django zwraca odpowiedź 403 (zabronione), jeśli przychodzące żądanie POST nie działa, sprawdza Csrf. Można to zrobić za pomocą jQuery ajaxSetup, fragmenty kodu znajdują here

Dlatego, że to działa na żądanie GET, to po prostu, że GET żądania nie są sprawdzane przez middleware CSRF.

Wygląda na to, że budujesz tutaj formę, ale warto rozważyć użycie formularzy klasowych. Zajmują się sprawą get/post, a także walidacją parametrów. Bardzo schludny. Zwłaszcza, gdy tworzysz formularze do edycji/tworzenia/usuwania instancji modelu, w takim przypadku możesz wykorzystać moc ModelForms i CreateViews. Bardzo schludny.

Może minąć trochę czasu, zanim powstaną ogólne widoki oparte na klasach. Ale warto to zrobić.

+0

Tak na innych stronach Używam FormView. Ale w tym przypadku nie mogę (długa historia). :) Teraz wszystko działa, ale w terminalu widzę [05/Oct/2012 15:08:11] "POST/something/HTTP/1.1" 500 9499 – premik91

+0

500 to po prostu błąd serwera. Może to być spowodowane błędem Pythona w twojej metodzie postu. –

+0

Ale to powinno pokazać, ponieważ jestem w trybie debugowania, czyż nie? – premik91

6

Musisz umieścić token CSRF (cross-site request forery) w swoim wywołaniu ajax. Jest to dobrze udokumentowane tutaj: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

lub, jeśli chcesz używać szybko naprawić, użyj dekorator @csrf_exempt do widzenia:

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    ... 
+0

Dziękuję człowieka :) – premik91

2

w szablonie Django można dodać to ...

{% csrf_token %} 

które wyjście będzie coś takiego na swojej stronie HTML ...

<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz"> 

Następnie za pomocą JavaScript można po prostu znaleźć to wejdź i uzyskaj jego wartość - coś podobnego do tego nie jQuery przykład ...

var el = document.getElementsByName("csrfmiddlewaretoken"); 
csrf_value = el[0].getAttribute("value"); 

Wreszcie dodać c srf_value do linii danych formularza po jQuery AJAX jak tak ...

data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value}, 

Oto pracuje jsFiddle pojęcie: https://jsfiddle.net/vdx1Lfpc/18/