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
相关产品推荐
相关产品推荐

