如何识别Django中NoReverseMatch错误的来源?

2024-10-04 11:23:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习django框架,并希望创建一个网站,在这里,被指定为“艺术家”的用户可以发布到网站

为避免混淆thcWebsite是项目名称。thcStore是项目中的一个应用程序

尝试加载时收到以下错误localhost:8000/thcStore/ 你知道吗

NoReverseMatch at /thcStore/
Reverse for 'product_detail' with arguments '(8, '')' not found. 1 pattern(s) tried: ['thcStore/(?P<id>[0-9]+)/(?P<slug>[-a-zA-Z0-9_]+)/$']
Request Method: GET
Request URL:    http://localhost:8000/thcStore/
Django Version: 2.2.2
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'product_detail' with arguments '(8, '')' not found. 1 pattern(s) tried: ['thcStore/(?P<id>[0-9]+)/(?P<slug>[-a-zA-Z0-9_]+)/$']
Exception Location: C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\urls\resolvers.py in _reverse_with_prefix, line 668

下面是错误回溯

Environment:


Request Method: GET
Request URL: http://localhost:8000/thcStore/

Django Version: 2.2.2
Python Version: 3.7.1
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'bootstrap3',
 'cart.apps.CartConfig',
 'orders.apps.OrdersConfig',
 'accounts',
 'payment.apps.PaymentConfig',
 'thcStore']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\Users\Taha Arif\Desktop\Web Development\Personal Website\django_THC\thcWebsite\templates\base.html, error at line 51
   Reverse for 'product_detail' with arguments '(8, '')' not found. 1 pattern(s) tried: ['thcStore/(?P<id>[0-9]+)/(?P<slug>[-a-zA-Z0-9_]+)/$']
   41 :               <div class="dropdown-menu" aria-labelledby="navbarDropdown">
   42 :                   <a class="dropdown-item" href="{% url 'accounts:user_profile' user.display_name %}">Profile</a>
   43 :                   <a class="dropdown-item" href="#">Settings</a>
   44 :                   <a class="dropdown-item" href="{% url 'accounts:thanks' %}">Logout</a>
   45 :               </div>
   46 :             {% else %}
   47 :             <div class="dropdown-menu" aria-labelledby="navbarDropdown">
   48 :                 <a class="dropdown-item" href="#">Settings</a>
   49 :                 <a class="dropdown-item" href="{% url 'accounts:thanks' %}">Logout</a>
   50 :                 <div class="dropdown-divider"></div>
   51 :                 <a class="dropdown-item" hr ef="#">Why make an account?</a >
   52 :             </div>
   53 :             {% endif %}
   54 :           {% else %}
   55 :             <div class="dropdown-menu" aria-labelledby="navbarDropdown">
   56 :                 <a class="dropdown-item" href="{% url 'accounts:signup' %}">Register</a>
   57 :                 <a class="dropdown-item" href="{% url 'accounts:login' %}">Login</a>
   58 :                 <div class="dropdown-divider"></div>
   59 :                 <a class="dropdown-item" href="#">Why make an account?</a>
   60 :             </div>
   61 :           {% endif %}


Traceback:

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Taha Arif\Desktop\Web Development\Personal Website\django_THC\thcWebsite\thcStore\views.py" in product_list
  22.                    'products': products,},)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\loader.py" in render_to_string
  62.     return template.render(context, request)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\backends\django.py" in render
  61.             return self.template.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render
  171.                     return self._render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\loader_tags.py" in render
  150.             return compiled_parent._render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\loader_tags.py" in render
  150.             return compiled_parent._render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\loader_tags.py" in render
  62.                 result = block.nodelist.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\loader_tags.py" in render
  62.                 result = block.nodelist.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\defaulttags.py" in render
  209.                     nodelist.append(node.render_annotated(context))

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in render
  987.             output = self.filter_expression.resolve(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in resolve
  671.                 obj = self.var.resolve(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in resolve
  796.             value = self._resolve_lookup(context)

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\template\base.py" in _resolve_lookup
  858.                             current = current()

File "C:\Users\Taha Arif\Desktop\Web Development\Personal Website\django_THC\thcWebsite\thcStore\models.py" in get_absolute_url
  55.                        args=[self.id, self.slug])

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\urls\base.py" in reverse
  90.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File "C:\Users\TAHAAR~1\Envs\MYPROJ~1\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix
  668.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /thcStore/
Exception Value: Reverse for 'product_detail' with arguments '(8, '')' not found. 1 pattern(s) tried: ['thcStore/(?P<id>[0-9]+)/(?P<slug>[-a-zA-Z0-9_]+)/$']

这让我很困惑,因为导航到localhost:8000/thcStore 应调用产品列表视图。不确定产品详细信息视图是什么导致了问题

第一次看到这个错误,我认为这是我的base.html文件中的一个问题。 但是当我删除一些东西并清理代码时,我发现错误总是出现在第51行,这让我相信问题不在base.html文件中,我不知道还能去哪里检查

thcStore的views.py

from django.shortcuts import render, get_object_or_404
from .models import Category, Product
from  cart.forms import CartAddProductForm
from django.views.generic import CreateView
from .forms import ProductCreateForm
from django.urls import reverse_lazy

def product_list(request, category_slug=None):
# Catalog View
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True)

    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=category)

    return render(request,
                  'thcStore/product/list.html',
                  {'category': category,
                   'categories': categories,
                   'products': products,},)

def product_detail(request, id, slug):
#product View
    product = get_object_or_404(Product,
                                id=id,
                                slug=slug,
                                available=True)
    cart_product_form = CartAddProductForm()
    return render(request, 'thcStore/product/detail.html',
              {'product': product,
               'cart_product_form': cart_product_form})

class product_create(CreateView):
        # form_class = forms.ProductCreateForm
        form_class = ProductCreateForm
        success_url = reverse_lazy("login")
        template_name = "thcStore/product/create.html"

thcStore的url.py

from django.urls import path
from . import views

app_name = 'thcStore'

urlpatterns = [
    path('', views.product_list, name='product_list'),
    path('product_create/', views.product_create.as_view(), name='product_create'),
    path('<slug:category_slug>/', views.product_list, name='product_list_by_category'),
    path('<int:id>/<slug:slug>/', views.product_detail, name='product_detail'),

]

用于thcStore的models.py

from django.db import models
from django.urls import reverse
from django.utils.text import slugify

class Category(models.Model):
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('thcStore:product_list_by_category',
                       args=[self.slug])

class Product(models.Model):
    category = models.ForeignKey(Category,
                                 related_name='products',
                                 on_delete=models.CASCADE)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d',
                              blank=True)
    owner= models.CharField(max_length=200, db_index= True, default= '')
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    # slug= slugify(name)
    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)

    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(Test, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('thcStore:product_detail',
                       args=[self.id, self.slug])

我希望我应该能够加载产品列表视图时localhost:8000/thcStore/ 被称为

可以使用您的故障排除技巧,或发人深省的问题

编辑:问题已解决

我有一个产品没有造成错误的子弹。删除该产品解决了问题


Tags: djangoinpyselflibpackagessitetemplate
2条回答

查看错误跟踪时,请始终查找包含文件的行,而不是包文件。情况并非总是如此(尤其是模板中的错误),但在您的情况下,您自己的代码中有两行错误:

File "C:\Users\Taha Arif\Desktop\Web Development\Personal Website\django_THC\thcWebsite\thcStore\views.py" in product_list
  22.                    'products': products,},)
.
.
.
File "C:\Users\Taha Arif\Desktop\Web Development\Personal Website\django_THC\thcWebsite\thcStore\models.py" in get_absolute_url
  55.                        args=[self.id, self.slug])

最底层的总是真正的罪魁祸首。第一个指向对render()的调用,该调用触发模板呈现链。在模板中,可能有一个{% url product %}调用Productget_absolute_url()

如您所见,这个错误告诉您它正在用参数'(8, '')'为“产品详细信息”调用reverse,这意味着self.slug是该特定产品的空字符串

你应该检查一下你的Product.save()方法,我认为它试图为每个产品创建一个slug,但是没有。什么是self.s什么是self.q

这个错误告诉您,在呈现产品列表页的过程中,它被要求为产品8生成一个指向产品详细信息页的链接——可能,您的列表页链接到详细信息页,正如您所期望的那样

它还告诉您,在生成链接时,它调用的是productget_absolute_url方法。该方法使用reverse查找给定id和slug的产品的URL。不幸的是,产品8的slug是一个空字符串,因此它不能为该产品生成一个与URL模式匹配的URL(这需要一个非空slug)

您应该通过管理员修复该产品(可能还有其他产品)的slug,然后研究它是如何用空slug保存的;我要指出的是,save方法看起来很狡猾(什么是self.q?)

相关问题 更多 >