summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2012-12-04 13:18:57 +0100
committerClaude Paroz <claude@2xlibre.net>2012-12-04 13:24:04 +0100
commit7fea7cf5d74a488f0c81b76cb7dc7fa74a86569c (patch)
treef5f9c5149cf5ed16806dc727c03f06f8635ed1c1
parent237a404d3ec678d1088dcd0b3630a3ea67ce08ea (diff)
[1.5.x] Fixed #19378 -- Ensured get_success_url returns a non-lazy URL
Backport of 795ac7deda from master.
-rw-r--r--django/views/generic/edit.py4
-rw-r--r--tests/regressiontests/generic_views/edit.py9
-rw-r--r--tests/regressiontests/generic_views/forms.py5
-rw-r--r--tests/regressiontests/generic_views/tests.py4
-rw-r--r--tests/regressiontests/generic_views/urls.py4
-rw-r--r--tests/regressiontests/generic_views/views.py11
6 files changed, 32 insertions, 5 deletions
diff --git a/django/views/generic/edit.py b/django/views/generic/edit.py
index e51cdf5a3d..97a6c0a698 100644
--- a/django/views/generic/edit.py
+++ b/django/views/generic/edit.py
@@ -1,6 +1,7 @@
from django.forms import models as model_forms
from django.core.exceptions import ImproperlyConfigured
from django.http import HttpResponseRedirect
+from django.utils.encoding import force_text
from django.views.generic.base import TemplateResponseMixin, ContextMixin, View
from django.views.generic.detail import (SingleObjectMixin,
SingleObjectTemplateResponseMixin, BaseDetailView)
@@ -50,7 +51,8 @@ class FormMixin(ContextMixin):
Returns the supplied success URL.
"""
if self.success_url:
- url = self.success_url
+ # Forcing possible reverse_lazy evaluation
+ url = force_text(self.success_url)
else:
raise ImproperlyConfigured(
"No URL to redirect to. Provide a success_url.")
diff --git a/tests/regressiontests/generic_views/edit.py b/tests/regressiontests/generic_views/edit.py
index 16f4da8efe..0f1eb3cca7 100644
--- a/tests/regressiontests/generic_views/edit.py
+++ b/tests/regressiontests/generic_views/edit.py
@@ -20,6 +20,15 @@ class FormMixinTests(TestCase):
initial_2 = FormMixin().get_initial()
self.assertNotEqual(initial_1, initial_2)
+
+class BasicFormTests(TestCase):
+ urls = 'regressiontests.generic_views.urls'
+
+ def test_post_data(self):
+ res = self.client.post('/contact/', {'name': "Me", 'message': "Hello"})
+ self.assertRedirects(res, 'http://testserver/list/authors/')
+
+
class ModelFormMixinTests(TestCase):
def test_get_form(self):
form_class = views.AuthorGetQuerySetFormView().get_form_class()
diff --git a/tests/regressiontests/generic_views/forms.py b/tests/regressiontests/generic_views/forms.py
index a78242f555..e036ad8afc 100644
--- a/tests/regressiontests/generic_views/forms.py
+++ b/tests/regressiontests/generic_views/forms.py
@@ -11,3 +11,8 @@ class AuthorForm(forms.ModelForm):
class Meta:
model = Author
+
+
+class ContactForm(forms.Form):
+ name = forms.CharField()
+ message = forms.CharField(widget=forms.Textarea)
diff --git a/tests/regressiontests/generic_views/tests.py b/tests/regressiontests/generic_views/tests.py
index c985ad3309..3f80600efe 100644
--- a/tests/regressiontests/generic_views/tests.py
+++ b/tests/regressiontests/generic_views/tests.py
@@ -6,6 +6,6 @@ from .dates import (ArchiveIndexViewTests, YearArchiveViewTests,
MonthArchiveViewTests, WeekArchiveViewTests, DayArchiveViewTests,
DateDetailViewTests)
from .detail import DetailViewTest
-from .edit import (FormMixinTests, ModelFormMixinTests, CreateViewTests,
- UpdateViewTests, DeleteViewTests)
+from .edit import (FormMixinTests, BasicFormTests, ModelFormMixinTests,
+ CreateViewTests, UpdateViewTests, DeleteViewTests)
from .list import ListViewTests
diff --git a/tests/regressiontests/generic_views/urls.py b/tests/regressiontests/generic_views/urls.py
index a212b830a5..9caf19365c 100644
--- a/tests/regressiontests/generic_views/urls.py
+++ b/tests/regressiontests/generic_views/urls.py
@@ -56,6 +56,10 @@ urlpatterns = patterns('',
(r'^detail/nonmodel/1/$',
views.NonModelDetail.as_view()),
+ # FormView
+ (r'^contact/$',
+ views.ContactView.as_view()),
+
# Create/UpdateView
(r'^edit/artists/create/$',
views.ArtistCreate.as_view()),
diff --git a/tests/regressiontests/generic_views/views.py b/tests/regressiontests/generic_views/views.py
index f7fcf6f509..71e78e82c7 100644
--- a/tests/regressiontests/generic_views/views.py
+++ b/tests/regressiontests/generic_views/views.py
@@ -2,11 +2,11 @@ from __future__ import absolute_import
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
-from django.core.urlresolvers import reverse
+from django.core.urlresolvers import reverse, reverse_lazy
from django.utils.decorators import method_decorator
from django.views import generic
-from .forms import AuthorForm
+from .forms import AuthorForm, ContactForm
from .models import Artist, Author, Book, Page, BookSigning
@@ -75,6 +75,13 @@ class AuthorListCustomPaginator(AuthorList):
orphans=2,
allow_empty_first_page=allow_empty_first_page)
+
+class ContactView(generic.FormView):
+ form_class = ContactForm
+ success_url = reverse_lazy('authors_list')
+ template_name = 'generic_views/form.html'
+
+
class ArtistCreate(generic.CreateView):
model = Artist