From c6c44bbdd0bd6a02a2ea8b44543066a2ed67ffe2 Mon Sep 17 00:00:00 2001 From: Chris Lawlor Date: Mon, 20 May 2013 07:49:14 -0400 Subject: [PATCH 1/2] Implements model save options, issue #110 --- .../admin2/bootstrap/model_add_form.html | 4 ++- djadmin2/views.py | 15 ++++++++-- example/blog/tests/test_views.py | 28 +++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/djadmin2/templates/admin2/bootstrap/model_add_form.html b/djadmin2/templates/admin2/bootstrap/model_add_form.html index 2fac865..e7bbb40 100644 --- a/djadmin2/templates/admin2/bootstrap/model_add_form.html +++ b/djadmin2/templates/admin2/bootstrap/model_add_form.html @@ -5,7 +5,9 @@
{% csrf_token %} {{ form.as_p }} - + + +
{% endblock content %} diff --git a/djadmin2/views.py b/djadmin2/views.py index 5cf8c83..a2feb24 100644 --- a/djadmin2/views.py +++ b/djadmin2/views.py @@ -121,12 +121,23 @@ class ModelEditFormView(AdminModel2Mixin, generic.UpdateView): class ModelAddFormView(AdminModel2Mixin, generic.CreateView): form_class = None - success_url = "../" default_template_name = "model_add_form.html" permission_type = 'add' def get_success_url(self): - view_name = 'admin2:{}_{}_detail'.format(self.app_label, self.model_name) + if '_continue' in self.request.POST: + view_name = 'admin2:{}_{}_update'.format(self.app_label, + self.model_name) + return reverse(view_name, kwargs={'pk': self.object.pk}) + + if '_addanother' in self.request.POST: + view_name = 'admin2:{}_{}_create'.format(self.app_label, + self.model_name) + return reverse(view_name) + + # default to detail view + view_name = 'admin2:{}_{}_detail'.format(self.app_label, + self.model_name) return reverse(view_name, kwargs={'pk': self.object.pk}) diff --git a/example/blog/tests/test_views.py b/example/blog/tests/test_views.py index 7c8e20e..69bc2a9 100644 --- a/example/blog/tests/test_views.py +++ b/example/blog/tests/test_views.py @@ -54,6 +54,34 @@ class PostCreateViewTest(BaseIntegrationTest): self.assertRedirects(response, reverse("admin2:blog_post_detail", args=(post.pk, ))) + def test_save_and_add_another_redirects_to_create(self): + """ + Tests that choosing 'Save and add another' from the model create + page redirects the user to the model create page. + """ + post_data = {"title": "a_post_title", + "body": "a_post_body", + "_addanother": ""} + self.client.login(username='admin', password='password') + response = self.client.post(reverse("admin2:blog_post_create"), + post_data) + post = Post.objects.get(title='a_post_title') + self.assertRedirects(response, reverse("admin2:blog_post_create")) + + def test_save_and_continue_editing_redirects_to_update(self): + """ + Tests that choosing "Save and continue editing" redirects + the user to the model update form. + """ + post_data = {"title": "Unique", + "body": "a_post_body", + "_continue": ""} + response = self.client.post(reverse("admin2:blog_post_create"), + post_data) + post = Post.objects.get(title="Unique") + self.assertRedirects(response, reverse("admin2:blog_post_update", + args=(post.pk, ))) + class PostDeleteViewTest(BaseIntegrationTest): def test_view_ok(self): From f66ffe8c8629fab5a9fdcfc486d3422b6e989b5d Mon Sep 17 00:00:00 2001 From: Chris Lawlor Date: Tue, 21 May 2013 14:01:30 -0400 Subject: [PATCH 2/2] Use admin2_url, redirect create form to index view. Uses the template tag admin2_url to create namespaced view names from inside of views. Create model form now redirects to the model index page, as django.contrib.admin. does. Removed get_success_url from ModelListView, as generic.ListView does not call this method. --- djadmin2/views.py | 20 +++++++------------- example/blog/tests/test_views.py | 3 +-- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/djadmin2/views.py b/djadmin2/views.py index a2feb24..a83ac25 100644 --- a/djadmin2/views.py +++ b/djadmin2/views.py @@ -9,6 +9,9 @@ from django.views import generic from braces.views import AccessMixin +from templatetags.admin2_urls import admin2_urlname + + ADMIN2_THEME_DIRECTORY = getattr(settings, "ADMIN2_THEME_DIRECTORY", "admin2/bootstrap") @@ -97,10 +100,6 @@ class ModelListView(Admin2Mixin, generic.ListView): context['model_pluralized'] = self.get_model()._meta.verbose_name_plural return context - def get_success_url(self): - view_name = 'admin2:{}_{}_detail'.format(self.app_label, self.model_name) - return reverse(view_name, kwargs={'pk': self.object.pk}) - class ModelDetailView(AdminModel2Mixin, generic.DetailView): default_template_name = "model_detail.html" @@ -126,19 +125,14 @@ class ModelAddFormView(AdminModel2Mixin, generic.CreateView): def get_success_url(self): if '_continue' in self.request.POST: - view_name = 'admin2:{}_{}_update'.format(self.app_label, - self.model_name) + view_name = admin2_urlname(self, 'update') return reverse(view_name, kwargs={'pk': self.object.pk}) if '_addanother' in self.request.POST: - view_name = 'admin2:{}_{}_create'.format(self.app_label, - self.model_name) - return reverse(view_name) + return reverse(admin2_urlname(self, 'create')) - # default to detail view - view_name = 'admin2:{}_{}_detail'.format(self.app_label, - self.model_name) - return reverse(view_name, kwargs={'pk': self.object.pk}) + # default to index view + return reverse(admin2_urlname(self, 'index')) class ModelDeleteView(AdminModel2Mixin, generic.DeleteView): diff --git a/example/blog/tests/test_views.py b/example/blog/tests/test_views.py index 69bc2a9..0ff839d 100644 --- a/example/blog/tests/test_views.py +++ b/example/blog/tests/test_views.py @@ -51,8 +51,7 @@ class PostCreateViewTest(BaseIntegrationTest): follow=True) self.assertTrue(Post.objects.filter(title="a_post_title").exists()) post = Post.objects.get(title="a_post_title") - self.assertRedirects(response, reverse("admin2:blog_post_detail", - args=(post.pk, ))) + self.assertRedirects(response, reverse("admin2:blog_post_index")) def test_save_and_add_another_redirects_to_create(self): """