Приложения Django, использующие представления на основе классов и ajax?

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

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

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

Спасибо :)


person Jesus Rodriguez    schedule 09.11.2011    source источник
comment
Я бы порекомендовал вам разобраться с ними отдельно. Гораздо проще работать с AJAX, если вы заставите сайт работать без него, затем определите некоторые интерфейсы JSON, а затем добавите немного AJAX, чтобы сделать его лучше/быстрее.   -  person SystemParadox    schedule 09.11.2011
comment
Что ж, это идея для каждого фреймворка, заставить его работать без ajax, а затем использовать ajax. Это то, что ты имеешь в виду? :)   -  person Jesus Rodriguez    schedule 09.11.2011
comment
Я думаю, что он имеет в виду полностью разделить ваши представления Ajax, т.е. иметь набор представлений для получения обычных запросов и отдельный набор представлений для обработки запросов ajax (возможно, в виде API)   -  person Timmy O'Mahony    schedule 09.11.2011
comment
Что ж, как бывший разработчик asp.net mvc, у меня были действия для обычных представлений и действия только для ajax (которые возвращают данные json).   -  person Jesus Rodriguez    schedule 09.11.2011


Ответы (3)


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

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

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

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

person Timmy O'Mahony    schedule 09.11.2011
comment
Я читал это раньше, но представления на основе классов сложнее, чем я думал. Документ Django огромен, каждый раз, когда вы его читаете, вы обнаруживаете новую ссылку, и эта ссылка содержит 30 ссылок для чтения: P. Проблема в том, что документ говорит, что просто дампа недостаточно, поэтому я хотел бы увидеть какой-нибудь пример из реального мира, чтобы увидеть, как люди его используют, и посмотреть, расширят ли они это микширование json, как говорится в документе. - person Jesus Rodriguez; 09.11.2011
comment
Зачем включать в документацию невероятно полезный фрагмент кода, а не саму библиотеку? Глупый Джанго... - person Cerin; 09.05.2014

без использования популярных пакетов 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');
person yassi    schedule 16.11.2012

Если вы хотите поддерживать как 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. Там, где он возвращает «Успех», вы можете добавить более сложную логику, но это основная идея.

person Apollo Data    schedule 08.06.2017
comment
Вау, красиво и просто - person Tunn; 28.01.2018
comment
обратите внимание, теперь это JsonResponse (строчная SON) - person Julian; 13.01.2021