在Django模板中使用AJAX时遭遇Could not parse the remainder错误求助
Django AJAX商品筛选模板渲染错误排查与解决
相关代码
视图函数
def filter_data(request): categories = request.GET.getlist('category[]') brands = request.GET.getlist('brand[]') allProducts = Product.objects.all().order_by('-id').distinct() if len(categories) > 0: allProducts = allProducts.filter(Categories__id__in=categories).distinct() if len(brands) > 0: allProducts = allProducts.filter(Brand__id__in=brands).distinct() t = render_to_string('ajax/shop.html', {'product': allProducts}) return JsonResponse({'data': t})
HTML中的AJAX脚本
{% block script%} <script> $(document).ready(function(){ $(".filter-checkbox").on('click', function(){ var filter_object={}; $(".filter-checkbox").each(function(index,ele){ var filter_value=$(this).val(); var filter_key=$(this).data('filter'); console.log(filter_key,filter_value); filter_object[filter_key]=Array.from(document.querySelectorAll('input[data-filter='+filter_key+']:checked')).map(function(el){ return el.value; }); }); $.ajax({ url:'{% url filter-data %}', data:filter_object, dataType:'json', success:function(res){ $("#filteredProducts").html(res.data); } }); }); }); </script> {% endblock %}
URL配置
path('shop/filter-data',filter_data,name='filter-data'),
错误情况
运行时先触发模板渲染错误:Could not parse the remainder: '-data' from 'filter-data',错误定位在脚本的url:'{% url filter-data %}'行。将其修改为url:'{% url 'filter-data' %}'后,仍出现模板语法错误(提示URL名称未注册或命名空间问题)。
解决方案
1. 修正URL标签的引号与命名空间
- 若URL未设置命名空间,确保
{% url %}标签内的名称用引号包裹,且与外层引号区分开(避免解析冲突):url:"{% url 'filter-data' %}" - 若URL配置在带命名空间的应用下(比如主
urls.py中用include('app.urls', namespace='shop')),需加上命名空间前缀:url:"{% url 'shop:filter-data' %}"
2. 验证URL名称与视图导入
- 检查URL配置中的
name='filter-data'拼写完全匹配模板中引用的名称,无大小写或字符错误。 - 确认URL所在文件已正确导入
filter_data视图:from .views import filter_data
3. 清除模板缓存
Django可能缓存旧模板内容,执行以下命令清除缓存后重启开发服务器:
python manage.py clearcache
4. 修复AJAX与视图的参数匹配
当前AJAX构造的参数键为category/brand,但视图中获取的是category[]/brand[],需二选一调整:
- 方案一:修改视图获取逻辑为
request.GET.getlist('category')和request.GET.getlist('brand') - 方案二:修改AJAX的参数键名:
filter_object[filter_key + '[]'] = Array.from(document.querySelectorAll('input[data-filter='+filter_key+']:checked')).map(function(el){ return el.value; });
内容的提问来源于stack exchange,提问作者user21944756
相关产品推荐
相关产品推荐

