0

現在、関数ベースのビューを新しい 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>
[...]

ビュー.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()),

)

私が間違っていることは何ですか?

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 に答える