最后将项目升级到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'),
有什么想法吗?
答案 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,
})