【问题标题】:Django NoReverseMatch in form redirect表单重定向中的 Django NoReverseMatch
【发布时间】:2015-07-02 15:58:06
【问题描述】:

我收到以下错误:

NoReverseMatch at /lld/new/

Reverse for 'display_lld' with arguments '()' and 
keyword arguments '{'slug': u'stack-overflow-new-document'}' not found.
0 pattern(s) tried: []

虽然我认为这与我的 url 正则表达式或传递给 views.py 中的 index.html 模板的 document.slug 变量有关,但我无法深入了解。

views.py:

from django.shortcuts import get_object_or_404, render, redirect

from .models import Document
from .forms import DocumentForm


def index(request):
    document_list = Document.objects.order_by('-date_updated')
    context = {'document_list': document_list}
    return render(request, 'lld/index.html', context)


def display_lld(request, slug):
    document = get_object_or_404(Document, slug=slug)
    return render(request, 'lld/display_lld.html', {'document': document})


def new_lld(request):
    if request.method == "POST":
        form = DocumentForm(request.POST)
        if form.is_valid():
            document = form.save(commit=False)
            document.save()
            return redirect('display_lld', slug=document.slug)
    else:
        form = DocumentForm()
    return render(request, 'lld/new_lld.html', {'form': form})

网站 urls.py:

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

应用 urls.py:

from django.conf.urls import url

from . import views

urlpatterns = [
    # example: /lld/
    url(r'^$', views.index, name='index'),
    # example: /lld/new/
    url(r'^new/$', views.new_lld, name='new_lld'),
    # ex: /lld/customername-projectname/
    url(r'^(?P<slug>([\w-]+))/', views.display_lld, name='display_lld'),
]

index.html:

{% if document_list %}
    <ul>
    {% for document in document_list %}
        <li><a href="{% url 'lld:display_lld' document.slug %}">{{ document.customer }} / {{ document.title }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No documents are available.</p>
{% endif %}
<a href="{% url 'lld:new_lld' %}">Create New LLD</a>

表单可以很好地创建新文档,它会显示在管理员中。但是当我单击表单保存按钮时,它会显示NoReverseMatch 错误,而不是重定向回创建的文档。新创建的文档列在索引页面上,我可以通过单击那里的链接导航到它,它似乎只是在表单重定向中抛出错误。

【问题讨论】:

    标签: python regex django


    【解决方案1】:

    当调用redirect 时,您忽略了lld 命名空间。使用 redirectreverse 时需要包含命名空间,就像在模板中使用 {% url %} 标记时一样:

    return redirect('lld:display_lld', slug=document.slug)
    

    【讨论】:

    • 谢谢,我知道这很简单!非常感谢。
    【解决方案2】:
    from django.core.urlresolvers import reverse
    
    return redirect(reverse('lld:display_lld', args=[document.slug]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2016-04-02
      • 1970-01-01
      • 2016-03-20
      • 2014-04-29
      相关资源
      最近更新 更多