私はDjangoを学んでいて、クラスベースのビューを見つけました。それらのビューにAjaxを実装する方法を考えています。
GithubでDjangoプロジェクトを検索しましたが、クラスベースのビューを使用しているものもありますが、ajaxは使用していません。
だから...誰もが両方を使用するオープンソースプロジェクトを知っていますか?そのように学ぶ方が簡単です。
ありがとうございました :)
Ajaxビューは、通常のリクエストを処理するときに通常は異なる形式を返したいことを除いて、通常のビューと大差ありません。この形式は通常JSONです。
ドキュメントには、JSONを返すために使用できるミックスインの例が含まれているため、これは良い出発点です。
https://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/#more-than-just-html
ビューが通常のリクエストに応答するか、AJAXリクエストのみを処理するか?前者の場合、唯一のトリックは、render_to_responseメソッドに小さなチェックを書き込んで通常のGETを拒否することです。後者の場合、上記のリンクは、ajaxリクエストと通常のリクエストを処理するビューを作成できる状況について説明しています。
人気のある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固有のURLを入力するのを防ぎます。
短い例になるため、以下はテンプレートをレンダリングするクラスベースの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)
これで、htmlスニペットをレンダリングする必要があるすべてのajaxに対して、次のような短いクラスベースのビューを定義できます。
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');
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を返します。 'Success'が返される場合は、より高度なロジックを追加することをお勧めしますが、これが基本的な考え方です。