Приложения Django с использованием представлений на основе классов и ajax?
Я изучаю Django, и я нашел представления на основе классов, и мне интересно, как реализовать Ajax в этих представлениях.
Я искал github для проекта django, и я нашел некоторые из них, используя классные представления, но не ajax.
Итак... Кто-нибудь знает проект с открытым исходным кодом, который использует обе вещи? Легче это узнать.
Спасибо:)
Ответы
Ответ 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. Когда он возвращает "Успех", вы можете добавить более сложную логику, но это основная идея.