无法使基于类的RedirectView工作

时间:2011-05-13 11:21:26

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

我目前正在尝试为基于django 1.3类的新视图迁移基于函数的视图。首先,我改变了一个简单的RedirectView,但是我无法让它工作,甚至最糟糕的是,我无法理解类视图的工作原理。机制很简单,我在索引页面中有一个select字段,用户选择一个选项并单击“go”。视图必须获取与该名称对应的URL并重定向到那里。

发送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()),

)

我做错了什么?

2 个答案:

答案 0 :(得分:1)

只能通过引用类的名称来引用urls.py中的基于类的视图。与well documented一样,您需要调用classmethod as_view

 (r'^go/', go_to_space.as_view()),

你应该真正关注PEP8并使你的类名为GoToSpace,这将使功能的区别变得更加明显。

此外,get_redirect_url是一种方法,因此它应该有self作为第一个位置参数。

答案 1 :(得分:0)

<强>解决:

django 1.3中的RedirectView 接受GET请求,我正在进行POST(按照django 1.2.x中的建议)

此问题已针对django 1.3.x(ticket #15739

修复