【问题标题】:Can't make class-based RedirectView work无法使基于类的 RedirectView 工作
【发布时间】:2011-05-13 11:21:25
【问题描述】:

我目前正在尝试为新的 django 1.3 基于类的视图迁移基于函数的视图。首先,我更改了一个简单的 RedirectView,但我无法让它工作,更糟糕的是,我无法理解类视图是如何工作的。机制很简单,我在索引页面有一个选择字段,用户选择一个选项并点击“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()),

)

我做错了什么?

【问题讨论】:

  • 你的 urls.py 呢?

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


【解决方案1】:

您不能仅通过引用类的名称来引用 urls.py 中基于类的视图。和well documented一样,需要调用类方法as_view

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

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

另外,get_redirect_url 是一个方法,所以它应该将self 作为第一个位置参数。

【讨论】:

  • 关于 PEP8 我知道,但我在做测试时并不介意。事情是我可能会忘记之后更改名称。谢谢提醒。我会在几分钟内测试代码:)
  • 测试代码给我一个 405 错误:S 我会用新代码更新问题
【解决方案2】:

已解决:

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

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

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2017-05-08
    • 2017-02-19
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多