【问题标题】:Having trouble handling AJAX with Django Class Based View使用基于 Django 类的视图处理 AJAX 时遇到问题
【发布时间】:2025-12-15 06:00:02
【问题描述】:

我一直在尝试将我的代码从基于 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 的确切使用方式。

【问题讨论】:

    标签: javascript ajax django rest django-class-based-views


    【解决方案1】:
    最近更新 更多