You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中AJAX请求报错:SyntaxError非法字符串问题排查

问题排查与解决

1. 修复后端视图核心逻辑错误

你的ProductListView存在两个致命问题:

  • get_context_data方法仅负责构建模板渲染的上下文字典,绝对不能返回元组+JsonResponse,这种错误返回会让Django输出非法响应内容,直接触发前端语法错误。
  • AJAX请求的处理逻辑不该放在get_context_data里,需重写post方法专门处理POST类型的AJAX请求。

修改后的views.py代码:

from django.http import JsonResponse
from django.views.generic import ListView
from .models import Product
import timezone

class ProductListView(ListView):
    model = Product
    paginate_by = 10
    template_name = 'shop/home.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['now'] = timezone.now()
        return context

    def post(self, request, *args, **kwargs):
        # 识别AJAX请求
        if request.headers.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':
            product = request.POST.get('product', '')
            # 此处可添加实际搜索逻辑,比如过滤Product模型数据
            # products = Product.objects.filter(name__icontains=product)
            # 示例先返回接收的搜索关键词
            return JsonResponse({'data': product})
        # 非AJAX请求走默认逻辑
        return self.get(request, *args, **kwargs)

2. 修正前端AJAX的格式问题

AJAX配置里的type: ' POST'包含多余空格,虽不致命但不符合规范,可能引发潜在解析问题,去掉空格即可:

const sendSearchData = (product)=>{
    $.ajax({
        type: 'POST',  // 移除前面的空格
        url: 'search/',
        data: {
            'csrfmiddlewaretoken':csrf,
            'product': product,
        },
        success: (res)=>{
            console.log('---res ---', res)
        },
        error:(err)=>{
            console.log('---error---',err)
        }
    })
}

3. 确认URL路由配置正确

确保urls.py里将search/路由指向ProductListView:

from django.urls import path
from .views import ProductListView

urlpatterns = [
    path('', ProductListView.as_view(), name='home'),
    path('search/', ProductListView.as_view(), name='product-search'),
]

4. 可选优化:添加请求防抖

输入时频繁触发AJAX请求会浪费资源,添加防抖逻辑减少请求次数:

let debounceTimer;
const sendSearchData = (product)=>{
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(() => {
        $.ajax({
            type: 'POST',
            url: 'search/',
            data: {
                'csrfmiddlewaretoken':csrf,
                'product': product,
            },
            success: (res)=>{
                console.log('---res ---', res)
                // 此处可将搜索结果渲染到resultsBox容器中
            },
            error:(err)=>{
                console.log('---error---',err)
            }
        })
    }, 300); // 300ms延迟,可根据需求调整
}

内容的提问来源于stack exchange,提问作者Copy-Ninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:42:50