Задать вопрос
timofeydeys
@timofeydeys
Свобода творцов

Почему выскакивает ошибка при ajax запросе?

Добрый вечер дорогие форумчане. Подскажите пожалуйста, почему при попытке отправить ajax запрос, у меня выскакивает alert из error??? Всю голову уже сломал, весь интернет уже перерыл.
2) И почему после того как я нажимаю ок в alert у меня перезагружается страница??

шаблон
{% extends "crm/main_struct.html" %}
{% load staticfiles %}

{% block content %}

<!--ОБЯЗАТЕЛЬНО СДЕЛАТЬ ФУНКЦИЮ НА JS КОТОРАЯ БУДЕТ ВЫЧИСЛЯТЬ ОТСТУПЫ И В НУЖНОЕ МЕСТО ПИХАТЬ КОНТЕНТ САЙТОВ-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<script>
$(document).ready(function() {
  $('ul.tabs_m_w').each(function() {
    $(this).find('li').each(function(i) {
      $(this).click(function() {
        $(this).addClass('active').siblings().removeClass('active');
        var p = $(this).parents('div.tabs_container_m_w');
        p.find('div.tab_container_m_w').hide();
        p.find('div.tab_container_m_w:eq(' + i + ')').show();
      });
    });
  });
})
</script>
<a href="{{url}}/crm/my_work/new/" class="add_notebook_a">
    <div class="add_notebook">Добавить</div>
</a>
<div class="tabs_container_m_w">
  <ul class="tabs_m_w">
      {% for notebook in notebookList %}
        <li class="inl-bl_m_w">
            <div class="m_w_list_head">{{notebook.name}}</div>
            <div class="m_w_list_date">{{notebook.date_firstly}}</div>
            <div class="m_w_list_kr_info">{{notebook.kr_info}}</div>
        </li>
      {% endfor %}
  </ul>

    {% for notebook in notebookList %}
  <div class="tab_container_m_w">
      <a href="" onclick="resend({{notebook.id}});" class="a_tab">
          <div class="m_w_save">
            Сохранить
          </div>
      </a>
    <div class="m_w_info_head" id="name{{notebook.id}}" contentEditable="true">{{notebook.name}}</div>
      <div class="m_w_info_info" id="info{{notebook.id}}" contentEditable="true">{{notebook.information}}</div>
  </div>
{% endfor %}

</div>

<script>
    function resend(pk){
           var name = document.getElementById('name' + pk).innerHTML.trim().replace(/<.*?>/g, "");
           var info = document.getElementById('info' + pk).innerHTML.trim().replace(/<.*?>/g, "");
           edit(name, info, pk);
    }
</script>

<script>
function edit(name, info, pk) {
// Если поля заполнены, отправляем их значения
        $.ajax({
            error: function() {
                alert('Ошибка получения запроса');
            },
    // При успехе очищаем поля и меняем кнопочку
                success: function(data) {
                 alert("Успех"); // для проверки, что скрипт работает
                },
    // CSRF механизм защиты Django
                beforeSend: function(xhr, settings) {
                    console.log('-------------before send--');
                    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;
                    }
                    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
                        // Only send the token to relative URLs i.e. locally.
                        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
                    }
                }
            });// ajax


        return false;
    };
</script>
{% endblock %}


urls.py
urlpatterns = patterns('',
    url(r'^my_work/edit/$', views.NBEdit, name='crm_edit_NB'),
)


views.py
def NBEdit(request):
    if request.is_ajax():
        for i in MyDela.objects.filter(pk=request.POST.get("id", "")):
            i.name = request.POST.get("name", "")[:250]
            i.information = request.POST.get("info", "")
            i.save()
        #  return HttpResponse("ok")
        return HttpResponseRedirect('/crm/sites/')
    else:
        #  return HttpResponse("bad")
        return HttpResponseRedirect('/crm/zayvki/')


Прошу не кидаться помидорами, я только учусь кодить))
  • Вопрос задан
  • 4353 просмотра
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
У вашего ajax - запроса нет ютл куда обращаться за информацией, отсутствует тип запроса(это не критично), отсутствует data(информация которую отправляете) . Всю инфу которую отправляете и обрабатываете во вьюхе нужно укласть в data.

Пример
$.ajax({
            method: "POST",
            url: '/invite/',
            data: {
            'email': email.val(),
            'csrfmiddlewaretoken': CSRF_TOKEN,
            'language':lang
            },
            success: function(response, status) {
              alert(response['msg']);
              dialog.dialog( "close" );
                },
            error: function(response) {
              alert("Error");
              dialog.dialog( "close" );
            }
          });

Также можно вот это //CSRF механизм защиты Django сделать вот так
<script >var CSRF_TOKEN = "{{ csrf_token }}"</script>
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
syschel
@syschel
freelance/python/django/backend
Что бы после клика не было перехода, нужно сделать "ретурн фолс" у функции клика. Что бы не было ошибки, нужно узнать что это за ошибка, а для этого посмотреть что отдаёт сервер и что он получает, в этом вам поможет firebug в фаерфокс или аналоги в других браузерах.
Ответ написан
Комментировать
@newpy
web-dev
Возвращаешь редирект, ожидаешь получить html... (dataType: html - означает что ты в ответ ждешь именно html). Получаешь редирект (код ответа сервера будет 304 вроде, а не 200), поэтому success и не выполняется скорей всего, выполняется error.

Просмотрел, не тот код выкинул)))

А еще совет грамотно формулировать вопросы, если хочешь получить ответы. А то из комментариев я так понял что и код не совсем тот выложен.

я редирект сделал, что бы понять, выполняется ли код во вьюхе или нет

Зачем тогда выкладываешь сюда такой код, которым ты что-то там проверяешь, и потом удивляешься что не работает?

Для начала убрал бы свои CSRF токены и сделал бы нормальный, простой ajax запрос, с нормальным ответом от сервера, вместо редиректов. Добился бы выполнения success. Поэтапно добавлял свою логику, и проверил бы на каком этапе и после добавления чего получаешь не тот результат который ожидаешь. Заодно научишься искать свои ошибки. Это будет полезнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы