Ajax работает форма представления работает только один раз Django - PullRequest
1 голос
/ 12 декабря 2011

У меня есть это приложение для блога, в котором я хочу дать кнопку предварительного просмотра, которая сохраняет форму, а затем открывает блог в новом окне.Javascript для этого

  $(function() {
    var current_link = location.href;

    $(".preview_button").click(function() 
    {           
        $.ajax({
          type: "POST",
          url: current_link,
          data: $("#blog_form").serialize(),
          dataType: 'json',
          success: function(data) 
          {
            window.open(data,'preview_tab');
            $("#reply-message").html('Form saved');
          },
          error: function(request,error) 
          {
            $("#reply-message").html('Form not saved because error:' + error);
          },

        });

        return false;   
    });
  }

);

Я обрабатываю это в views.py как

 if request.is_ajax():
        if request.method == 'POST':

            author = User.objects.get(pk=author_id)
            blog = get_object_or_404(Entry, creator = author, slug = slug)

            title = request.POST.get('title', False)
            text = request.POST.get('text', False)
            tags = request.POST.get('tags', False)
            enable_comments = request.POST.get('enable_comments', False)

            blog.title = title
            blog.text = text
            blog.tags = tags
            blog.enable_comments = enable_comments

            blog.save()

            return_message = '/blogs/' + str(blog.creator.id) + '/' + str(blog.slug) + '/' + 'preview/' 
            return HttpResponse(simplejson.dumps(return_message),mimetype='application/javascript')

return_message содержит URL-адрес страницы предварительного просмотра и используется для ее открытия вновое окно.У меня две проблемы

  1. Форма отправляется только один раз, используя этот javascript, для повторной отправки мне нужно обновить страницу.
  2. Во-вторых, обновляются все поля блога, кроме textarea.Я не понимаю, почему это может происходить

Редактировать: причина проблемы

  1. Первая проблема заключается в том, чтотот же токен csrf отправляется при сериализации формы, так есть ли способ удалить этот токен из функции сериализации?

  2. Вторая проблема заключается в том, что я использую редактор TinyMCE в текстовой области, и когда я что-то печатаю в редакторе, изменения не отражаются в реальном текстовом поле.Как я могу выбрать текст из текстового редактора, а не из базовой (наиболее вероятно) скрытой текстовой области

1 Ответ

2 голосов
/ 12 декабря 2011

Проблема 1 звучит так, как будто она может быть связана со встроенной в Джанго защитой от CSRF .Попробуйте проверить HTTP-запросы с помощью такого инструмента, как Charles или Firebug , и проверьте, отправляется ли один и тот же токен CSRF дважды.Если защита CSRF явно не отключена для представления, отправка формы будет отклонена во второй раз, если токен не обновлен.

В документах есть раздел, посвященный этому в Ajaxcode.

Хотя я не могу сказать наверняка, возможно, что проблема 2 связана с процессом выбора jQuery, для каких полей он включается при сериализации.Начиная с их документов :

Примечание: только «успешные элементы управления» сериализуются в строку.Значение кнопки отправки не сериализуется, так как форма не была отправлена ​​с помощью кнопки.Чтобы значение элемента формы было включено в сериализованную строку, элемент должен иметь атрибут name.Значения из флажков и переключателей (входы типа «радио» или «флажок») включаются, только если они отмечены.Данные из элементов выбора файлов не сериализуются.

...