Приложения Django, использующие классовые представления и ajax? - PullRequest
18 голосов
/ 09 ноября 2011

Я изучаю Django, и я нашел представления на основе классов, и мне интересно, как реализовать Ajax в этих представлениях.

Я искал в github проект django и обнаружил, что некоторые используют представления на основе классов, но не ajax.

Итак ... Кто-нибудь знает проект с открытым исходным кодом, который использует обе вещи? Так легче учиться.

Спасибо:)

Ответы [ 3 ]

13 голосов
/ 16 ноября 2012

без использования популярных пакетов dajaxic и dajax, это все еще простое дело.

Было бы полезно написать декоратор, который просто обернул бы функцию is_ajax () в django для объектов запроса, например так:

def ajax_request(function):
    def wrapper(request, *args, **kwargs):
        if not request.is_ajax():
            return render_to_response('error/ajax_required.html', {},
                context_instance=RequestContext(request))
        else:
            return function(request, *args, **kwargs)
    return wrapper

при условии, что существует шаблон с именем ajax_required для обработки этого конкретного сбоя.Что-то вроде этого не позволяет пользователю вводить ваш определенный URL-адрес ajax в браузере, если вы этого не хотите.

Поскольку это делается для более короткого примера, ниже приведено представление ajax на основе классов, которое отображает шаблон..

from django.views.generic.base import TemplateView

class AjaxGeneral(TemplateView):
    template_name= None
    def get(self, request):
        data={}
        return render_to_response(self.template_name, data,
            context_instance=RequestContext(request))

    @method_decorator(ajax_request)
    def dispatch(self, *args, **kwargs):
        return super(AjaxGeneral, self).dispatch(*args, **kwargs)

теперь для всего ajax, который просто необходим для рендеринга фрагмента html, вы можете определять короткие представления на основе классов, такие как:

class ShowSomeTable(AjaxGeneral):
    template_name="some_table.html"

Предполагая, что в some_table.html есть некоторый фрагмент html..

Теперь ваша запись urls.py для этого представления будет выглядеть так:

url(r'showtable/$', ShowSomeTable.as_view()),

, и вы можете вызывать ее в js как обычно:

$(#dynamic-content).load('/showtable');
10 голосов
/ 09 ноября 2011

Представление Ajax не сильно отличается от обычного представления, за исключением того, что вы обычно хотите вернуть другой формат, чем при обработке обычного запроса. Обычно это формат JSON.

В документации есть пример миксина, который можно использовать для возврата JSON, так что это хорошая отправная точка:

https://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/#more-than-just-html

Вы хотите, чтобы ваш взгляд отвечал на обычные запросы или имел дело только с запросами AJAX? Если первое, единственный трюк - написать небольшую проверку в методе render_to_response, чтобы отклонить любые нормальные запросы GET. Если последний вариант, то приведенная выше ссылка продолжает обсуждение ситуации, когда вы можете создать представление, которое будет обрабатывать запросы ajax и обычные запросы.

2 голосов
/ 08 июня 2017

Если вы хотите поддерживать как AJAX, так и традиционные представления, вы можете добавить что-то вроде этого в CreateView:

# at top of file
from django.http import JSONResponse  

# inside CreateView class
def render_to_response(self, context, **response_kwargs):
    """ Allow AJAX requests to be handled more gracefully """
    if self.request.is_ajax():
        return JSONResponse('Success',safe=False, **response_kwargs)
    else:
        return super(CreateView,self).render_to_response(context, **response_kwargs)

Это обычно обрабатывает обычные представления (с перенаправлением и т. Д.), Но для AJAX возвращаетJSONResponse вместо.Там, где возвращается «Успех», вы можете добавить более сложную логику, но это основная идея.

...