Django出现NoReverseMatch错误,topping路由反向匹配失败如何解决?
问题根源
错误出在pizzas.html模板的链接参数传递错误,还有几个配套的小问题需要一起修正:
- 你在模板里遍历的是
pizzas查询集,每个迭代变量是pizza(披萨对象),但你调用pizzas:topping路由时传了不存在的toppings.id,变量为空所以匹配不到数字类型的路由参数,触发NoReverseMatch。 - 你的
topping视图逻辑是接收披萨ID,查询对应披萨的所有配料,所以路由参数应该传当前循环的披萨ID:pizza.id。 - 额外修正:你的
Toppings模型的__str__方法缩进错误,写在了Meta类内部,会导致后台显示配料的时候出现异常。
修正步骤
1. 修正pizzas.html模板的链接参数
把<a href="{% url 'pizzas:topping' toppings.id %}">改成如下内容,同时删掉后面重复输出的{{ pizza }}:
<li> <a href="{% url 'pizzas:topping' pizza.id %}">{{ pizza }}</a> </li>
2. 修正Toppings模型的__str__方法缩进
把models.py里的Toppings类的__str__方法移出Meta类,修改后代码如下:
class Toppings(models.Model): """A topping for each pizza.""" pizza = models.ForeignKey(Pizzas, on_delete=models.CASCADE) topping = models.TextField() class Meta: verbose_name_plural = 'toppings' # 调整缩进,和Meta类平级,属于Toppings类的方法 def __str__(self): return f"{self.topping}"
3. 可选优化
你当前的topping视图参数叫toppings_id但实际存的是披萨ID,容易混淆,可以改成pizza_id,同步修改应用urls.py的路由参数名即可,避免后续维护出错。
修正后重新启动服务就能正常访问披萨列表,点击对应披萨就能跳转到配料详情页。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

