Изменение значения базы данных через AJAX

-2

Я пытаюсь заставить 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);
        }
    }
});


});
  • 0
    Я не понимаю, почему вы изменили URL. / идет к индексу голосования, а не к просмотру голосов.
  • 0
    Я просто сделал это, потому что это был единственный способ подключиться к серверу без ошибки. Если я использую url: /vote/ он выбрасывает 404 not found .
Теги:

1 ответ

0
Лучший ответ

Ваша проблема не имеет ничего общего с вашим Ajax. Ваша проблема заключается в вашем голосовании /urls.py: вы включаете другие URL-адреса с шаблоном, который заканчивается на $, поэтому ничего лишнего не будет соответствовать. Должен быть:

url(r'^', include('values.urls')),

(Обратите внимание, что 1.9 будет предупреждать об этом поведении явно).

Теперь вы можете изменить место, где ваши сообщения Ajax вернутся к правильному URL.

  • 0
    Теперь xhr загружен, но я получаю 500 error на http://localhost/vote . Почему это происходит? /vote уже определено в моих взглядах.
  • 0
    Без понятия. Вам придется посмотреть на ошибку; Вы должны увидеть его с помощью инструментов разработчика браузера.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню