django.core.urlresolvers.NoReverseMatch错误
我有一个叫做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})
不过,为什么你想让删除页面在删除后重新指向自己呢?