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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:35:30