开发者

Can't make class-based RedirectView work

开发者 https://www.devze.com 2023-03-05 10:38 出处:网络
I\'m currently trying to migrate my function based views for the new django 1.3 class-based views. To start, I changed a simple RedirectView I had, but I cant get it to work, even worst, I can\'t unde

I'm currently trying to migrate my function based views for the new django 1.3 class-based views. To start, I changed a simple RedirectView I had, but I cant get it to work, even worst, I can't understand how the class view works. The mechanism is simple, I have a select field in the index page, the user select an option and clicks "go". The view must get the url corresdponding to that name and re开发者_开发技巧direct there.

When sending the POST signal, django doesn't return anything, just a 405 error in the terminal.

UPDATED code:

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

)

What I am doing wrong?


You can't refer to a class-based view in urls.py just by referencing the name of the class. As is well documented, you need to call the classmethod as_view:

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

You should really follow PEP8 and make your class name GoToSpace, which would make the difference from a function more obvious.

Also, get_redirect_url is a method, so it should have self as the first positional argument.


SOLVED:

RedirectView in django 1.3 only accepts GET requests, I was doing a POST (as recommended in django 1.2.x)

This issue was fixed for django 1.3.x (ticket #15739)

0

精彩评论

暂无评论...
验证码 换一张
取 消