Я пытаюсь заставить AJAX работать с Django (1.8).
Моя проблема исходит из метода $.ajax
, он не отправляет значения на сервер. Мне пришлось изменить маршрут для значения url
из url: '/vote/'
для url: '/'
чтобы он мог работать (и не возвращал 404 не найден), но он не отправляет значения (база данных не изменяется), Также в index.html
<a href={% url 'views.vote' %}></a>
возвращает ошибку, поэтому я использую <a href="/vote/"></a>
.
Вот что я имею:
├── assets
│ ├── css
│ │ └── style.css
│ └── js
│ ├── app.js
│ └── jquery.js
├── db.sqlite3
├── manage.py
├── templates
│ └── index.html
├── values
│ ├── __init__.py
│ ├── admin.py
│ ├── migrations
│ │ ├── __init__.py
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
└── votes
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
Значения /models.py
from django.db import models
class Value(models.Model):
title = models.CharField(max_length=255)
points = models.IntegerField(default=1)
def __str__(self):
return self.title
голосов /urls.py
from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$', include('values.urls')),
]
urlpatterns += staticfiles_urlpatterns()
значения/адрес
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', 'values.views.index'),
url(r'^vote/$', 'values.views.vote'),
]
Значения /views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from .models import Value
def index(request):
val = Value.objects.all()
return render(request, 'index.html', {'values': val})
def vote(request):
value = get_object_or_404(Value, pk=request.POST.get('value'))
value.points += 1
value.save()
return HttpResponse()
Шаблоны /index.html
{% load static from staticfiles %}
<html>
<head>
<title>My title</title>
<script src="{% static 'js/jquery.js' %}"></script>
<script src="{% static 'js/app.js' %}"></script>
<link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
<ul>
{% for foo in values %}
<li>
<p class="story-title">
{{ foo.title}}
</p>
<p class="points">
<a href="/vote/" class="vote" id="story-vote-{{ foo.id }}">{{ foo.points }} points </a>
</p>
</li>
{% endfor %}
</ul>
</body>
</html>
активы /JS/app.js
$(document).ready(function(){
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function vote (valueID) {
$.ajax({
type: 'POST',
url: '/',
data: { "value": valueID },
success: function () {
//$("#story-vote-" + valueID).hide();
$("#story-title-" + valueID).css({"margin-left": "15px"});
},
headers: {
'X-CSRFToken': csrftoken
}
});
return false;
}
$("a.vote").click(function () {
var valueID = parseInt(this.id.split("-")[2]);
return vote(valueID);
})
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
});
Ваша проблема не имеет ничего общего с вашим Ajax. Ваша проблема заключается в вашем голосовании /urls.py: вы включаете другие URL-адреса с шаблоном, который заканчивается на $
, поэтому ничего лишнего не будет соответствовать. Должен быть:
url(r'^', include('values.urls')),
(Обратите внимание, что 1.9 будет предупреждать об этом поведении явно).
Теперь вы можете изменить место, где ваши сообщения Ajax вернутся к правильному URL.
xhr
загружен, но я получаю 500 error
на http://localhost/vote
. Почему это происходит? /vote
уже определено в моих взглядах.
/
идет к индексу голосования, а не к просмотру голосов.url: /vote/
он выбрасывает404 not found
.