从1.4升级到Django 1.6后的NoReverseMatch

时间:2014-02-05 23:08:45

标签: python django django-class-based-views

最后将项目升级到1.6,现在我遇到了URL和基于类的视图的问题。

我的表格是这样的:

<form action="{{ project.get_absolute_url }}" method="post" id="editproject" >

项目模型包括:

@permalink
def get_absolute_url(self):
    return  ('project_url', (), {'slug': self.slug})

在尝试加载页面时,我会收到此错误:

NoReverseMatch at /teamslug1/projectslug1/teamid1/projectid1/
Reverse for 'project_url' with arguments '()' and keyword arguments '{'slug': u'projectslug1'}' not found. 1 pattern(s) tried: ['(?P<teamslug>[^\\.]+)/(?P<projectslug>[^\\.]+)/(?P<teamid>[^\\.]+)/(?P<projectid>[^\\.]+)/$']

如果我将表单变量包装在引号中:

<form action="{{ "project.get_absolute_url" }}" method="post" id="editproject" >

加载时不会出错,但是当我使用表单发布时,它会产生一个这样的网址:http://0.0.0.0:5000/teamslug1/projectslug1/teamid1/projectid1/project.get_absolute_url,它不存在。

这是urls.py信息:

url(r'^(?P<teamslug>[^\.]+)/(?P<projectslug>[^\.]+)/(?P<teamid>[^\.]+)/(?P<projectid>[^\.]+)/$', 'ideas.views.projects', name='project_url'),

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这看起来不像Django 1.6或基于类的视图特有的问题。问题是get_absolute_url方法与URL模式不匹配。

首先,将变量包装在引号中肯定是不正确的。 Django将其视为字符串,您的浏览器将其视为相对链接,并将表单发布到错误的URL。

project_url网址格式有四个关键字参数,但您的get_absolute_url方法仅指定slug,这不是其中一个参数。我希望您的get_absolute_url方法看起来像:

@permalink
def get_absolute_url(self):
    return  ('project_url', (), {'teamslug': self.teamslug,
                                 'projectslug': self.projectslug,
                                 'projectid': self.projectid,
                                 'teamid ': self.teamid,
    })

请注意,文档建议您使用reverse而不是permalink装饰器。

from django.core.urlresolvers import reverse

def get_absolute_url(self):
    return  reverse('project_url', kwargs={'teamslug': self.teamslug,
                                           'projectslug': self.projectslug,
                                           'projectid': self.projectid,
                                           'teamid ': self.teamid,
    })