Django NoReverseMatch while return render()

Django NoReverseMatch while return render()

我总是收到 NoReverseMatch 错误,我不知道为什么。 这是错误消息:

NoReverseMatch at /suche/any-thing/

Reverse for 'article_search' with arguments '(u'any thing',)' not found. 1 pattern(s) tried: ['suche/(?P[-\w]+)/$']

如您所见,我正在输入带有“-”而不是白色 space 的 url,但 Django 正在寻找带有 [=33] 的 url 模式=] 而不是“-”。

这是我的 url 模式:

    url(r'suche/(?P<search>[-\w]+)/$', views.article_search_view, name='article_search'),

令人惊讶的是 Django 开始计算我的 article_search_view,它看起来像这样:

def article_search_view(request, search=None):
"""Filters all articles depending on the search and renders them"""

articles = get_active_not_rented_articles()
search = re.sub(r"[-]", ' ', search)
articles = articles.filter(title__icontains=search)
articles = aply_sort(request, articles)
orderd_by = articles[0].get('filter')
articles = articles[1]
return render(request, 'article/list.html', {'object_list':articles, 'url_origin':'article_search', 'parameter':search,
'orderd_by':orderd_by})

当我检查“print()”语句时,调用 return render(...) 语句时会引发错误。 如果我改为执行 return redirect(...) ,则不会引发任何错误。 为了完整起见,我的 article/list.html 模板:

{% extends "base.html" %}
{% load static %}

{% block content %}

<div id =articles>
<div class="info_filter">
<div class="header_info_filter">
  {% if orderd_by == "not" %}
  <h1>Neueste Artikel</h1>
  {% endif %}
  {% if orderd_by == "distance" %}
  <h1>Artikel in Ihrer Nähe</h1>
  {% endif %}
  {% if orderd_by == "price_asc" %}
  <h1>Günstigste Artikel zuerst</h1>
  {% endif %}
  {% if orderd_by == "price_des" %}
  <h1>Teuerste Artikel zuerst</h1>
  {% endif %}
</div>

<div class="selection">
  {% if parameter1 %}
  <form action="{% url url_origin parameter1 parameter2 %}" method="post" accept-charset="utf-8">
    {% else %}
    {% if parameter %}
    <form action="{% url url_origin parameter %}" method="post" accept-charset="utf-8">
      {% else %}
      <form action="{% url url_origin %}" method="post" accept-charset="utf-8">
        {% endif %}
        {% endif %}
        {% csrf_token %}
        <div class="select_filter">
          <select name="filter" id="filter" >
            <option value="distance">Entfernung</option>
            <option value="price_asc">Preis, aufsteigend</option>
            <option value="price_des">Preis, absteigend</option>
          </select>
          <div class="search_filter_btn">
            <button type="submit" name="button">Sortieren</button>
          </div>
        </div>

      </form>
    </div>
    {% if parent_categorys %}
    <div class="category-path">
      Ergebnisse für:
      {% for category in parent_categorys %}
      <a href="{% url 'article_category' category.slug %}"> > {{ category.name }}</a>
      {% endfor %}
      {% if parameter2 %}
      : {{ parameter2}}
      {% endif %}
    </div>
    {% else %}
    Ergebnisse für: {{ parameter}}
    {% endif %}
  </div>
  <div id="main" class="article_list">
    {% for article in object_list %}
    <div class="item">
      <div class="list_img">
        <a href="{{ article.get_absolute_url }}">
          <img src="{% if article.main_picture %}{{ article.main_picture.url }}{% else %}{% static "img/no_image.png" %}{% endif %}">
        </a>

      </div>
      <div class= "articles_fee" >
        {{ article.fee }} €
      </div>
      <a href="{{ article.get_absolute_url }}">{{ article.title }}</a>
    </div>
    {% endfor %}
  </div>

</div>
{% endblock %}

如果您需要更多信息,请告诉我。

在您看来,您更改了 search 并将连字符替换为空格。当您在模板中使用 url 标记时,这会导致错误,因为 URL 模式不允许空格。

{% url url_origin parameter %}

您可以通过将原始搜索 slug 添加到模板上下文来解决此问题:

def article_search_view(request, search=None):
    """Filters all articles depending on the search and renders them"""
    search_slug = search
    articles = get_active_not_rented_articles()
    search = re.sub(r"[-]", ' ', search)
    ...
    return render(request, 'article/list.html', {'object_list':articles, 'url_origin':'article_search', 'parameter':search, 'search_slug': search_slug, 'orderd_by':orderd_by})

然后更改url标签:

{% url url_origin search_slug %}