【问题标题】:NoReverseMatch at... (Django)NoReverseMatch 在...(Django)
【发布时间】:2021-10-26 21:15:02
【问题描述】:

得到错误:

未找到带有参数“('',)' 的“topping”的反向操作。尝试了 1 种模式:['topping/(?P[0-9]+)/$'] 请求方法:GET 请求网址:http://127.0.0.1:8000/pizzas/ Django 版本:3.2.8 异常类型:NoReverseMatch 异常值:
未找到参数“(”,)”的“顶部”反向。尝试了 1 种模式:['topping/(?P[0-9]+)/$']

admin.py:

from django.contrib import admin

from .models import Pizzas, Toppings

admin.site.register(Pizzas)
admin.site.register(Toppings)

models.py:

from django.db import models

class Pizzas(models.Model):
    """A Pizza for the menu."""
    pizza = models.TextField()

    def __str__(self):
        """Return string of model."""
        return self.pizza

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'

        def __str__(self):
            return f"{self.topping}"

views.py:

from django.shortcuts import render

从 .models 导入披萨

def index(request):
    """The home page for pizzeria."""
    return render(request, 'pizzas/index.html')


def pizzas(request):
    """Show all pizzas."""
    pizzas = Pizzas.objects.all()
    context = {'pizzas': pizzas}
    return render(request, 'pizzas/pizzas.html', context)


def topping(request, toppings_id):
    """Show each topping for a pizza."""
    pizzas = Pizzas.objects.get(id=toppings_id)
    toppings = pizzas.topping_set.all()
    context = {'pizzas': pizzas, 'toppings': toppings}
    return render(request, 'pizzas/toppings.html', context)

项目 urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('pizzas.urls')),
]

应用 urls.py:

from django.urls import path

从 .导入视图

app_name = '披萨'

urlpatterns = [
    # Home page
    path('', views.index, name='index'),
    # Pizza menu
    path('pizzas/', views.pizzas, name='pizzas'),
    # Detail page for Toppings.
    path('pizzas/<int:toppings_id>/', views.topping, name='topping'),
]

pizzas.html 模板:

{% extends "pizzas/base.html" %}

{% block content %}

  <p>Pizzas</p>

  <ul>
      {% for pizza in pizzas %}
        <li>
          <a href="{% url 'pizzas:topping' toppings.id %}">{{ pizza }}</a>{{ pizza }}
        </li>
      {% empty %}
        <li>No pizzas.</li>
      {% endfor %}
  </ul>

{% endblock content %}

我已经包含了我认为重要的内容。这里是初学者程序员,所以如果我在这篇文章中遗漏了什么,请告诉我。我尽力了解 NoReverseMatch 的原因是什么,但没有一个解决方案解决了这个问题。 Pizzas 函数是获取所有的比萨饼和相关的配料,并存储在一个数据库中,该数据库为配料分配一个 id?然后应该通过 get() 获取哪个?我是这么理解的。

【问题讨论】:

  • 您在pizzas 视图的上下文中没有toppings,当在上下文中找不到某些内容时,您在pizzas.html 模板的url 标记中使用toppings.id返回一个空字符串,因此您将一个空字符串传递给 url
  • 我认为这是因为 url 的命名参数。你试过 {% url 'pizzas:topping' toppings_id=toppings.id %}
  • @IainShelvington,我在上下文中添加了浇头,但出现了类型错误。
  • 我同意@IainShelvington,看起来toppings 没有设置在pizzas view 中。您是如何添加它以产生类型错误的?

标签: python django


【解决方案1】:

不确定您的模型是什么样的,但如果 toppings 是 Pizza 模型下的一个字段(只有这样才有意义),您必须像访问模型上的任何字段一样访问它:

pizza.toppings.id

【讨论】:

  • models.py 粘贴在上面。但是不,toppings 不是 topping 模型的一部分,toppings 是它自己的模型。
猜你喜欢
  • 2016-07-20
  • 2017-04-18
  • 1970-01-01
  • 2014-02-10
  • 2017-05-21
  • 2020-08-03
相关资源
最近更新 更多