【问题标题】:Django 1.10 NoReverseMatch - exits but does not match?Django 1.10 NoReverseMatch - 退出但不匹配?
【发布时间】:2017-03-13 09:04:28
【问题描述】:

我想构建一个“列表”视图,其中将显示数据库中的所有图像。 这是模板:

{% extends "base.html" %}
{% block title %}Your images{% endblock %}
{% block content %}
    <ul>
        {% for picture in images %}

            <a href="{% url "detail" id=picture.id slug=picture.slug %}">
            <img src="{{ picture.image.url }}" class="image-detail">
            </a>

        {% endfor %}
    </ul>

{% endblock %}

以及列表和详细网址:

url(r'^detail/(?P&lt;id&gt;\d+)/(?P&lt;slug&gt;[\w]+)/$',views.image_detail,name='detail')

url(r'^list/$', views.image_list, name='list')

当用户点击图片时,他应该被重定向到该页面的“详细”视图。

def image_detail(request, id, slug):
    image = get_object_or_404(Image, id=id, slug=slug)
    return render(request,
    'images/image/detail.html',
    {'section': 'images',
    'image': image})

def image_list(request):
    images = Image.objects.all()
    return render(request,'images/image/list.html',{'images':images})

可以看出,'detail' 视图有 2 个参数:id 和 slug。 在上面的模板中,我得到了相应图片的 id 和 slug (id=picture.id slug=picture.slug) 的这些参数。 在我运行服务器之后,当我尝试访问我网站上的列表页面时,

我收到“NoReverseMatch”错误: 异常值:未找到带有参数“()”和关键字参数“{'id': 1, 'slug': 'django-and-duke'}' 的“详细信息”的反转。尝试了 0 个模式:[].

我启动了 shell,导入了 Image 模型,然后我想检查是否真的没有任何具有该 id 和 slug 的图像。

>>> Image.objects.get(id=1,slug='django-and-duke')
<Image: Django and Duke>

所以实际上有一个带有请求的 id 和 slug 的 Image 对象......这是怎么回事?

编辑:图像模型:

class Image(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                        related_name='images_created')

    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200,
                                    blank=True)

    users_like = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                    related_name='images_liked',
                                    blank=True)

    image = models.ImageField(upload_to='images',blank=True)

    description = models.TextField(blank=True)

    created = models.DateField(auto_now_add=True, db_index=True)

    objects = models.Manager()  # The default manager.
    published = PublishedManager()  # Our custom manager.

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
            super(Image, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('images:detail', args=[self.id, self.slug])`

【问题讨论】:

  • 这些模式在哪些 urls.py 中?如果它们不在主项目的 urls.py 中,那么您如何包含它们?
  • 该错误并不是说该项目不存在,而是说它找不到您的 URL 模式。
  • 发布你的模型,那里定义了get_absolute_url 方法吗?
  • 你的应用有命名空间吗?也许你必须这样写:&lt;a href="{% url 'namespace:detail' id=picture.id slug=picture.slug %}"&gt;
  • @Alasdair 图片应用的 url 包含在项目的 url 中:url(r'^images/', include('images.urls', namespace='images')),

标签: django image templates url match


【解决方案1】:

您是namespacing 网址。所以,它会是这样的:

<a href="{% url 'images:detail' id=picture.id slug=picture.slug %}">

在你的根 urls.py 中,你可能有这样的东西:

urlpatterns = [
    ...
    url(r'^', include('images.urls', namespace='images'))
]

一些编辑想法:

  1. {% url %} 中的 id=slug= 部分不是必需的。没有它们也能正常工作。但是显式比隐式好,对吧?

  2. 当出现以下错误时:Exception Value: Reverse for '&lt;view_name&gt;' with arguments '('arg1', ...)' and keyword arguments '{'key1': kayvalue1, ...}' not found. 0 pattern(s) tried:[],则在 99% 的情况下,url pattern 找到(具有正确的 args 或/和 kwargs)但缺少 namespace。解决方案:{% url 'namespace:view_name' args/kwrags here %}

  3. 当出现以下错误:Exception Value: Reverse for '&lt;view_name&gt;' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried:[] 时,99% 的时间url pattern 找到但 args 或/和 kwargs 未被识别。解决方案:最好检查urls的声明/语法

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 2017-07-30
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2016-03-28
    • 2013-12-27
    • 2018-02-03
    相关资源
    最近更新 更多