django.core.urlresolvers.NoReverseMatch错误

2 投票
3 回答
3680 浏览
提问于 2025-04-18 05:39

我有一个叫做FAQ的应用程序,我正在使用django-vanilla-views,这个应用之前运行得很好,但现在出现了一个错误,错误信息大致是:

NoReverseMatch: 找不到 'delete_question' 的反向匹配,传入的参数是 '('',)',关键字参数是 '{}'。尝试了 1 个模式:['faq/delete/(?P\d+)/$']

这里插入图片描述

以下是相关代码:

from django.db import models
# Create your models here.
from autoslug import AutoSlugField
from taggit.managers import TaggableManager

class QuestionType(models.Model):
    title   = models.CharField(max_length=255, unique=True)
    slug    = AutoSlugField(populate_from='title', unique=True, max_length=255, blank=False)

    def __unicode__(self):
        return u"%s " % (self.title)


class Question(models.Model):
    title       = models.CharField(max_length=255)
    description = models.TextField()
    slug        = AutoSlugField(populate_from='title', max_length=255, unique=True, blank=False)
    category    = models.OneToOneField('QuestionType', blank=False, related_name='question')
    tags        = TaggableManager()

    def __unicode__(self):
        return "%s. %s " % (self.title, self.category)


from .models import Question from vanilla import CreateView, DeleteView, UpdateView, ListView from django.core.urlresolvers import reverse_lazy

# Create your views here.

class QuestionList(ListView):
    model = Question
    template_name = "faq/question_list.jade"


class CreateQuestion(CreateView):
    model = Question
    template_name = "faq/question.jade"
    success_url = reverse_lazy('question_list')


class EditQuestion(UpdateView):
    model = Question
    template_name = 'faq/question_list.jade'
    success_url = reverse_lazy('question_list')


class DeleteQuestion(DeleteView):
    model = Question
    success_url = reverse_lazy('delete_question')


from django.conf.urls import patterns, url

from .views import QuestionList, CreateQuestion, EditQuestion, DeleteQuestion

urlpatterns = patterns(
    '',
   # URL pattern for the
   url(regex=r'^faq/$', view=QuestionList.as_view(), name='question_list'),
   url(regex=r'^faq/create/$', view=CreateQuestion.as_view(), name='create_question'),
   url(regex=r'^faq/edit/(?P<pk>\d+)/$', view=EditQuestion.as_view(), name='edit_question'),
   url(regex=r'^faq/delete/(?P<pk>\d+)/$', view=DeleteQuestion.as_view(), name='delete_question'),
)

from vanilla import TemplateView

class HomePageView(TemplateView):
    template_name = "pages/home.jade"


class TermsPageView(TemplateView):
    template_name = "templates/question_list.jade"
    pass

configuration/urls.py

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

admin.autodiscover()

urlpatterns = patterns('',
                       url(r'', include('apps.pages.urls')),
                       url(r'', include('apps.faq.urls')),
                       url(r'^admin/', include(admin.site.urls)),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

base.jade

.collapse.navbar-collapse
    ul.nav.navbar-nav.pull-left
        {% url 'home' as home %}
        {% if request.path == home %}
        li.active
            a(href="{% url 'home' %}") {% blocktrans %}Home{% endblocktrans %}
        {% else %}
        li
            a(href="{% url 'home' %}") {% blocktrans %}Home{% endblocktrans %}
        {% endif %}

        {% url 'about' as about %}
        {% if request.path == about %}
        li.active
            a(href="{% url 'about' %}") {% blocktrans %}About us{% endblocktrans %}
        {% else %}
        li
            a(href="{% url 'about' %}") {% blocktrans %}About us{% endblocktrans %}
        {% endif %}

        {% url 'contact' as contact %}
        {% if request.path == contact %}
        li.active
            a(href="{% url 'contact' %}") {% blocktrans %}contact{% endblocktrans %}
        {% else %}
        li
            a(href="{% url 'contact' %}") {% blocktrans %}contact{% endblocktrans %}
        {% endif %}

        {% url 'faq' as faq %}
        {% if request.path == faq %}
        li.active
            a(href="{% url 'question_list' %}") {% blocktrans %}FAQ{% endblocktrans %}
        {% else %}
        li
            a(href="{% url 'question_list' %}") {% blocktrans %}FAQ{% endblocktrans %}
        {% endif %}


        {% if request.user.is_staff %}
        li
            a(href="{% url 'admin:index' %}") {% blocktrans %}Admin{% endblocktrans %}
        {% endif %}

这个错误和正则表达式有关,我不太明白为什么之前能正常工作,现在却出现了错误!!

需要一些帮助,感谢!

3 个回答

2

你的成功网址是

success_url = reverse_lazy('delete_question')

但是你的 delete_question 网址需要一个叫 pk 的参数,没有参数的 delete_question 网址是不存在的,所以你才会遇到这个错误。

从逻辑上讲,你的成功网址应该是 question_list 而不是 delete_question

2

这是因为你有两个网址叫做 'question_list',一个是 '^faq/$',另一个是 '^faq/delete/(?P\d+)/$'。你只需要把第二个改成 'delete_question',这样就没问题了。

6

你需要为 'delete_question' 这个网址指定一个 'pk' 参数。像这样应该可以正常工作:

class DeleteQuestion(DeleteView):
    model = Question

    def get_success_url(self):
        return reverse('delete_question', kwargs={'pk': self.object.pk})

不过,为什么你想让删除页面在删除后重新指向自己呢?

撰写回答