Napisałem bardzo mały przykład: przycisk junit, który wysyła żądanie POST z parą wartości:Jak napisać widok Django dla żądania POST
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>jQuery UI Button - Default functionality</title>
<script src="{{STATIC_URL}}js/jquery-1.9.1.js"></script>
<script src="{{STATIC_URL}}js/jquery-ui-1.10.3.custom.js"></script>
<link rel="stylesheet" href="{{STATIC_URL}}css/jquery-ui-1.10.3.custom.css">
<script>
$(function() {
$("button")
.button()
.click(function(event) {
var postdata = {
'value1': 7,
'value2': 5
};
$.post('', postdata); // POST request to the same view I am now
window.alert("Hello world!"); // To know it is working
});
});
</script>
</head>
<body>
<button>Submit</button>
</body>
</html>
Tak, widok jest renderowane, gdy Żądanie GET jest wysyłane do localhost: 8000/button /, a po naciśnięciu przycisku żądanie POST jest również wysyłane do localhost: 8000/button /.
urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns('',
url(r'^button/$', 'helloworld.views.buttonExample'),
)
views.py
def buttonExample(request):
print 'RECEIVED REQUEST: ' + request.method
if request.method == 'POST':
print 'Hello'
else: #GET
return render(request, 'buttonExample.html')
Gdy żądanie GET jest zrobione, jest prawidłowo wyświetlany widok i mogę również czytać w Django pocieszyć linie:
RECEIVED REQUEST: GET <---- This line is because of my print
[28/May/2013 05:20:30] "GET /button/ HTTP/1.1" 200 140898
[28/May/2013 05:20:30] "GET /static/js/jquery-1.9.1.js HTTP/1.1" 304 0
[28/May/2013 05:20:30] "GET /static/js/jquery-ui-1.10.3.custom.js HTTP/1.1" 304 0
[28/May/2013 05:20:30] "GET /static/css/jquery-ui-1.10.3.custom.css HTTP/1.1" 304 0
...
Po naciśnięciu przycisku widzę:
[28/May/2013 05:20:34] "POST /register/ HTTP/1.1" 403 142238
Ale "OTRZYMANE ZAPYTANIE: POST" nigdy nie jest drukowane. Ani "Hello". Wygląda na to, że urls.py nie wyświetla widoku, gdy przybył POST, ponieważ w Firebug widzę, że status POST jest 403 ZABRONIONY.
To prawdopodobnie głupia nowicjuszka, ale nie wiem, czego mi brakuje. Przeczytałem django book chapter about advanced URLConf and Views i wygląda na to, że powinno działać tylko poprzez sprawdzenie wartości request.method.
Dodaj tokena csrf do szablonu .. – Rajeev