如何向Django的views.py传值?传product id取到None怎么解决
问题修复方案
现有代码返回None的核心原因是AJAX配置的url参数没有用引号包裹,Django渲染{% url 'dashboard' %}后输出的是纯字符串,没有引号会被JS识别为变量,直接触发语法错误,请求无法正常发送,后端自然获取不到参数。
修复后的代码
模板JS部分
<script> function change(foo) { $.ajax({ url: "{% url 'dashboard' %}", // 新增引号包裹url值 method: "GET", // 显式指定请求方法,和后端取值逻辑对齐 data: { 'foo': foo, } }); } </script>
视图部分优化(可选)
给get方法加默认值,避免后续操作None时报错:
myRequets = request.GET.get('foo', '')
更优的参数传递方案
根据使用场景可以选择以下更规范的实现方式:
- 不需要异步请求的场景:直接将参数放到URL路径中,比GET参数更符合REST规范,也避免参数丢失问题
- 首先修改路由配置
urls.py
path('dashboard/<int:product_id>/', views.dashboard, name='dashboard')- 模板中直接用a标签跳转,不需要额外JS:
<div class="products__header--search-result"> <ul> {% for product in products %} <li><a href="{% url 'dashboard' product.id %}">{{ product.name }}</a></li> {% endfor %} </ul> </div>- 视图直接接收路径参数:
def dashboard(request, product_id): # 直接使用product_id即可,不需要从GET/POST中取值 - 首先修改路由配置
- 需要异步AJAX请求的场景:用自定义data属性代替内联onclick事件,实现HTML和JS逻辑解耦,更易维护
- 模板结构修改:
{% for product in products %} <li class="product-item" data-product-id="{{ product.id }}"><a href="#">{{ product.name }}</a></li> {% endfor %}- JS绑定事件:
$('.product-item').click(function() { const productId = $(this).data('product-id'); $.ajax({ url: "{% url 'dashboard' %}", method: "GET", data: {'foo': productId} }) }) - 参数为敏感信息的场景:改用POST请求传递,同时携带CSRF Token避免跨站请求伪造
后端从$.ajax({ url: "{% url 'dashboard' %}", method: "POST", headers: {"X-CSRFToken": "{{ csrf_token }}"}, data: {'foo': productId} })request.POST中取值即可:myRequets = request.POST.get('foo', '')
内容的提问来源于stack exchange,提问作者yousof
相关产品推荐
相关产品推荐

