我一直在尝试将代码从基于Django函数的视图切换到基于类的视图,但我无法理解如何在Django CBV中处理AJAX。
例如,假设我的Django博客项目中有这个实时搜索功能。 (对不起,我尽量让它尽可能简单。)
urls.py
url(r'^search/$', search_page),
forms.py
class SearchForm(forms.Form):
query = forms.CharField()
entire_search_page.html
<form id="search-form" method="get" action=".">
{{form.as_p}}
<input type="submit" value="search" />
</form>
<div id="search-results">
{% include "just_the_result.html" %}
</div>
just_the_result.html
{% for post in post_list %}
<li>{{ post.title }}</li>
views.py
def search_page(request):
form = SearchForm()
post_list = []
if 'query' in request.GET:
form = SearchForm({'query': query})
post_list = Post.objects.filter(title__icontains=query)
if request.GET.has_key('ajax'):
variables = RequestContext(request, {
'post_list': post_list,
})
return render_to_response('just_the_result.html', variables)
else:
variables = RequestContext(request, {
'form': form,
'post_list': post_list,
})
return render_to_response('entire_search_page.html', variables)
search.js
$(document).ready(function() {
$("#search-form").submit(search_submit);
});
function search_submit() {
var query = $("#id_query").val();
$("#search-results").load(
"/search/?ajax&query=" + encodeURIComponent(query)
);
return false;
}
基本上,我在请求正常时显示整个搜索页面,而如果请求是AJAX则只显示“just_the_result.html”。这在我运行服务器时工作正常,但我想将此视图更改为基于类的视图。
这是我到目前为止所做的:
views.py
class PostSearch(ListView):
model = Post
template_name = 'app_blog/search.html'
context_object_name = 'post_list'
def get_queryset(self):
queryset = super(PostSearch, self).get_queryset()
query = self.request.GET.get('query')
if query:
return queryset.filter(title__icontains=query)
else:
return queryset
我认为当请求正常时这可以正常工作。但是,当请求是AJAX请求时,我不知道该怎么做!在基于函数的视图中,我可以根据请求是否是AJAX返回不同的模板和变量,但我不认为这在CBV中是必要的甚至是可能的。还有一个问题。我最近一直在阅读有关RESTful设计的内容。我的代码上面被认为是“RESTful”吗?我无法理解REST API的使用方式。