无法使基于类的RedirectView工作
我目前正在尝试为基于新的django 1.3基于类的视图迁移基于功能的视图。首先,我改变了一个简单的RedirectView,但我无法让它工作,甚至最糟糕的是,我无法理解类视图是如何工作的。该机制很简单,我在索引页中有一个选择字段,用户选择一个选项并点击“开始”。该视图必须获得与该名称相对应的url并在那里重定向。无法使基于类的RedirectView工作
发送POST信号时,django不会返回任何内容,只是终端中的405错误。
修订代码:
的index.html
[...]
<div id="widget">
<h2>{% trans "Spaces list" %}</h2><br />
<form method="post" action="/spaces/go/">{% csrf_token %}
<select name="spaces">
{% for space in spaces %}
<option>{{ space.name }}</option>
{% empty %}
<option>{% trans "No spaces" %}</option>
{% endfor %}
</select>
<input type="submit" value="{% trans 'Go' %}" />
</form>
</div>
[...]
views.py
class GoToSpace(RedirectView):
url = "/spaces/"
def get_redirect_url(self, **kwargs):
self.place = get_object_or_404(Space, name = self.request.POST['spaces'])
return self.place.url
urls.py
from django.conf.urls.defaults import *
from e_cidadania.apps.spaces.views import GoToSpace
urlpatterns = patterns('',
(r'^go/', GoToSpace.as_view()),
)
我什么d错了吗?
解决:
RedirectView的在Django 1.3 只接受(如Django的1.2.x的建议)
这个问题是固定的Django的1.3.x的GET请求,我在做一个POST (ticket #15739)
只能通过引用类的名称来引用urls.py中的基于类的视图。正如well documented,你需要调用类方法as_view
:
(r'^go/', go_to_space.as_view()),
你真的应该遵循PEP8,让你的类名GoToSpace,这将使从比较明显的功能差别。
另外,get_redirect_url
是一种方法,所以它应该有self
作为第一个位置参数。
关于PEP8我知道,但是因为我在做一个测试,所以我不介意。事情是,我可能会忘记改名之后。感谢提醒。我会在几分钟内测试代码:) – 2011-05-13 14:05:18
测试代码会给我一个405错误:S我会用新代码更新问题 – 2011-05-13 14:23:49
你的urls.py怎么样? – 2011-05-13 11:42:19
对不起,忘了:) – 2011-05-13 11:53:30