【问题标题】:NoReverseMatch at / Reverse for 'product_list_by_category' with keyword arguments '{'slug': 'legume'}'NoReverseMatch at / Reverse for 'product_list_by_category' 关键字参数 '{'slug': 'legume'}'
【发布时间】:2018-05-13 16:00:47
【问题描述】:

每次我运行我的 django 项目时,我都会收到此错误 NoReverseMatch at / Reverse for 'product_list_by_category' with keyword arguments '{'slug': 'legume'}'。我想列出我的产品,老实说,我什至不知道问题出在哪里。

完整跟踪:django.urls.exceptions.NoReverseMatch:未找到带有关键字参数“{'slug': 'legume'}' 的“product_list_by_category”的反向。尝试了 1 种模式:['(?P\w+)/$'] [29/Nov/2017 22:18:22]“GET / HTTP/1.1”500 180670

我的主要网址

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from  django.conf.urls.static import static

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('shop.urls', namespace = 'shop'))
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

我的 Models.py 页面

from django.db import models
from django.core.urlresolvers import reverse

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length=120 , db_index = True)
    slug = models.SlugField(max_length=200 , db_index = True , 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('shop:product_list_by_category', kwargs={'slug':self.slug})


class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products')
    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)
    description = models.TextField(blank = True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now= True)

    class Meta:
        ordering = ('-created',)
        index_together = (('id','slug'),)

    def __str__(self):
        return self.name

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

我的应用网址

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.product_list, name='product_list'),
    url(r'^(?P<category_slug>\w+)/$', views.product_list, name='product_list_by_category'),
    url(r'^(?P<id>\d+)/(?P<slug>[-\w]+)/$', views.product_detail, name='product_detail'),
]

这是我的 Base.HTML

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}AgroShop{% endblock %}</title>
    <link rel = stylesheet href = '{% static "css/base.css" %}'>
</head>
<body>
    <div class="header">
        <a href="/" class = "logo">AgroShop</a>
    </div>

    <div class="subheader">
        <div class="cart">
            {% with total_items=cart|length %}
                {% if cart|length > 0 %}
                    Your cart :
                    <a href="{% url "cart:cart_detail" %}">
                        {{ total_items }} item{{ total_items|pluralize }}
                    </a>
                {% else %}
                    Your cart is empty.
                {% endif %}
            {% endwith %}
        </div>
    </div>

    <div id="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

List.HTML

{% extends 'shop/base.html' %}
{% load static %}

{% block title %}
    {% if category %}{{ category.name }}{% else %}{{ Products }}{% endif %}
{% endblock %}

{% block content %}
    <div class="sidebar">
        <h3>Categories:</h3>
        <ul>
            <li {% if not category %} class="selected">{% endif %}>
                <a href="{% url 'shop:product_list' %}">All</a>
            </li>
        {% for c in categories %}
            <li {% if category.slug == c.slug %} class = 'selected{% endif %}'>
                <a href="{{ c.get_absolute_url }}">{{ c.name }}</a>
            </li>
        {% endfor %}
        </ul>
    </div>

    <div id="main" class="product-list">
        <h1>{% if category %}{{ category.name }}{% else %}Products{% endif %}</h1>
        {% for product in products %}
            <div class="item">
                <a href="{{ product.get_absolute_url }}">
                    <img src="{% if product.image %}{{ product.image.url }}{% else %}{% static 'img/dirig.jpg' %}{% endif %}" alt="">
                </a>
                <a href="{{ product.get_absolute_url }}">{{ product.name }}</a><br>
                {{ product.price }}
            </div>
        {% endfor %}
    </div>
{% endblock %}

【问题讨论】:

    标签: python django web


    【解决方案1】:

    您在 URL 模式中使用 category_slug,但在调用 reverse 时使用 slug。确保 URL 模式、get_absolute_url 方法和视图全部匹配。

    【讨论】:

      【解决方案2】:

      You can use either:

      reverse('shop:product_list_by_category', kwargs={"category_slug": "myslug"})

      或者:

      reverse('shop:product_list_by_category', args=["myslug"])

      但是reverse('shop:product_list_by_category', kwargs={'slug': "myslug"}) 不起作用,因为您的 kwarg 中的键 slug 与您的 url 中的参数不匹配,即 category_slug

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 2015-10-15
        • 2020-10-21
        • 2019-02-22
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        相关资源
        最近更新 更多