• 31 Июл
  • 2015
Отправка Django Forms без перезагрузки страницы

Столкнулся с проблемой, когда в интерфейсе приходится очень часто отправлять данные на сервер и каждый раз ожидать перезагрузку страницы становится невыносимо. Было принято решение отправлять форму аяксом, а чтобы эта отправка была безопасной (то есть проверялся csrf_token), использовал следующий код:


from django.http import JsonResponse
from django.views.generic.edit import CreateView


class AjaxableResponseMixin(object):
    def form_invalid(self, form):
        print form
        response = super(AjaxableResponseMixin, self).form_invalid(form)
        if self.request.is_ajax():
            return JsonResponse(form.errors, status=400)
        else:
            return response

    def form_valid(self, form):
        response = super(AjaxableResponseMixin, self).form_valid(form)
        if self.request.is_ajax():
            data = {
                'pk': self.object.pk,
            }
            return JsonResponse(data)
        else:
            return response


class ItemCreate(AjaxableResponseMixin, CreateView):
    model = MyModel
    fields = ['field1', 'field2', 'field3', ]

В urls.py нужно прописать url для создания записи в БД и указать ItemCreate.as_viev().

Для того, чтобы интерфейс реагировал на изменения в БД можно дописать в javascript метод success, который бы перерисовывал элемент страницы, ответственный за эти данные:


function api(url, data, success){
    $.ajax({
        type: "POST",
        url: url,
        data: data,
        success: function(response){
            $("#results").load("getting_new_data_url");
        }
    });
}

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

comments powered by Disqus