CastleDweller
CastleDweller

Reputation: 8364

Can't make class-based RedirectView work

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 redirect 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?

Upvotes: 0

Views: 3477

Answers (2)

CastleDweller
CastleDweller

Reputation: 8364

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)

Upvotes: 0

Daniel Roseman
Daniel Roseman

Reputation: 599956

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.

Upvotes: 1

Related Questions