Django URL传slug报错:Field 'id'期望数字获字符串的解决求助
解决Django中通过文章Slug获取关联产品的ValueError问题
错误原因
你传递给视图的是文章的Slug字符串(如srednje),但视图中直接将其赋值给了外键字段a_article——而Django的外键默认关联的是关联模型的主键id(整数类型),因此当Django尝试把字符串转换为整数时,就抛出了Field 'id' expected a number but got 'srednje'的错误。
解决方案
方案1:先通过Slug找到文章,再过滤关联产品
修改视图代码,先根据Slug查询对应的Article实例,再基于该实例过滤关联的Product:
from django.shortcuts import render, get_object_or_404 from .models import Article, Product def product(request, slug): # 用get_object_or_404处理文章不存在的情况,返回404页面 article = get_object_or_404(Article, slug=slug) # 过滤该文章下的所有产品 products = Product.objects.filter(a_article=article) # 将产品列表传递给模板 return render(request, 'product.html', {'products': products})
同时修改URL配置,将参数名从pk改为slug,与视图参数对应:
path('<str:slug>/', views.product, name='product'),
方案2:直接跨表过滤(无需先查询文章)
利用Django的双下划线跨表查询特性,直接通过产品关联的文章Slug过滤:
from django.shortcuts import render from .models import Product def product(request, slug): products = Product.objects.filter(a_article__slug=slug) return render(request, 'product.html', {'products': products})
URL配置同样修改为:
path('<str:slug>/', views.product, name='product'),
额外注意事项
- 确保你的
Article实例中确实存在slug为srednje的记录,否则方案1会返回404页面,方案2会返回空的产品列表。 - 在模板
product.html中需要遍历产品列表进行展示,示例代码:
{% for product in products %} <div class="product-item"> <h3>{{ product.name }}</h3> <p>{{ product.description }}</p> </div> {% empty %} <p>该文章暂无关联产品</p> {% endfor %}
内容的提问来源于stack exchange,提问作者kurac
相关产品推荐
相关产品推荐

