0

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

发送 POST 信号时,django 不返回任何内容,只是在终端中返回 405 错误。

更新代码:

索引.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>
[...]

视图.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

网址.py

from django.conf.urls.defaults import *
from e_cidadania.apps.spaces.views import GoToSpace

urlpatterns = patterns('',

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

)

我做错了什么?

4

2 回答 2

1

您不能仅通过引用类的名称来引用 urls.py 中基于类的视图。正如有据可查,您需要调用 classmethod as_view

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

您应该真正遵循 PEP8 并将您的类名称命名为 GoToSpace,这将使与函数的区别更加明显。

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

于 2011-05-13T11:57:42.597 回答
0

解决了:

django 1.3 中的 RedirectView接受 GET 请求,我正在做一个 POST(在 django 1.2.x 中推荐)

此问题已针对 django 1.3.x 修复(票证#15739

于 2011-05-13T14:52:41.477 回答