Подтвердить что ты не робот

Приложения Django с использованием представлений на основе классов и ajax?

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

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

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

Спасибо:)

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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. Что-то вроде этого не позволяет пользователю вводить ваш собственный адрес 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');

Ответ 3

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