summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2015-02-06 23:25:15 +0100
committerClaude Paroz <claude@2xlibre.net>2015-02-08 20:55:09 +0100
commit32e6a7d3a57b2287d55e8b8efa4e8cb7643b1720 (patch)
tree305218f5ea11a368ae1c167d52bcd8d65da8b037
parent9033003d97d29f7754b0840333f6f362c0cd31f7 (diff)
Replaced hardcoded URLs in admin_* tests
Refs #15779. This will allow easier admin URL changes, when needed. Thanks Simon Charette for the review.
-rw-r--r--django/contrib/auth/admin.py2
-rw-r--r--tests/admin_changelist/tests.py4
-rw-r--r--tests/admin_custom_urls/tests.py8
-rw-r--r--tests/admin_inlines/tests.py90
-rw-r--r--tests/admin_views/customadmin.py2
-rw-r--r--tests/admin_views/tests.py1195
-rw-r--r--tests/admin_views/urls.py4
-rw-r--r--tests/admin_widgets/tests.py35
8 files changed, 693 insertions, 647 deletions
diff --git a/django/contrib/auth/admin.py b/django/contrib/auth/admin.py
index b791609031..928236914a 100644
--- a/django/contrib/auth/admin.py
+++ b/django/contrib/auth/admin.py
@@ -79,7 +79,7 @@ class UserAdmin(admin.ModelAdmin):
def get_urls(self):
return [
- url(r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password)),
+ url(r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password), name='auth_user_password_change'),
] + super(UserAdmin, self).get_urls()
def lookup_allowed(self, lookup, value):
diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py
index 8647ff7e2c..6d2e50a9d9 100644
--- a/tests/admin_changelist/tests.py
+++ b/tests/admin_changelist/tests.py
@@ -368,7 +368,7 @@ class ChangeListTests(TestCase):
username='super', email='super@localhost', password='secret')
self.client.login(username='super', password='secret')
event = Event.objects.create(date=datetime.date.today())
- response = self.client.get('/admin/admin_changelist/event/')
+ response = self.client.get(reverse('admin:admin_changelist_event_changelist'))
self.assertContains(response, formats.localize(event.date))
self.assertNotContains(response, six.text_type(event.date))
@@ -681,7 +681,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
"""
self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin/auth/user/'))
+ reverse('admin:auth_user_changelist')))
form_id = '#changelist-form'
diff --git a/tests/admin_custom_urls/tests.py b/tests/admin_custom_urls/tests.py
index 3260bc603c..c2d5ad4994 100644
--- a/tests/admin_custom_urls/tests.py
+++ b/tests/admin_custom_urls/tests.py
@@ -26,7 +26,9 @@ class AdminCustomUrlsTest(TestCase):
"""
Ensure GET on the add_view works.
"""
- response = self.client.get('/admin/admin_custom_urls/action/!add/')
+ add_url = reverse('admin:admin_custom_urls_action_add')
+ self.assertTrue(add_url.endswith('/!add/'))
+ response = self.client.get(add_url)
self.assertIsInstance(response, TemplateResponse)
self.assertEqual(response.status_code, 200)
@@ -35,7 +37,7 @@ class AdminCustomUrlsTest(TestCase):
Ensure GET on the add_view plus specifying a field value in the query
string works.
"""
- response = self.client.get('/admin/admin_custom_urls/action/!add/', {'name': 'My Action'})
+ response = self.client.get(reverse('admin:admin_custom_urls_action_add'), {'name': 'My Action'})
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'value="My Action"')
@@ -48,7 +50,7 @@ class AdminCustomUrlsTest(TestCase):
"name": 'Action added through a popup',
"description": "Description of added action",
}
- response = self.client.post('/admin/admin_custom_urls/action/!add/', post_data)
+ response = self.client.post(reverse('admin:admin_custom_urls_action_add'), post_data)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'dismissAddRelatedObjectPopup')
self.assertContains(response, 'Action added through a popup')
diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py
index 78889be30e..bad1508948 100644
--- a/tests/admin_inlines/tests.py
+++ b/tests/admin_inlines/tests.py
@@ -7,6 +7,7 @@ from django.contrib.admin.helpers import InlineAdminForm
from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType
+from django.core.urlresolvers import reverse
from django.test import RequestFactory, TestCase, override_settings
from django.utils.encoding import force_text
@@ -31,7 +32,6 @@ class TestInline(TestCase):
holder = Holder(dummy=13)
holder.save()
Inner(dummy=42, holder=holder).save()
- self.change_url = '/admin/admin_inlines/holder/%i/' % holder.id
result = self.client.login(username='super', password='secret')
self.assertEqual(result, True)
@@ -41,7 +41,10 @@ class TestInline(TestCase):
"""
can_delete should be passed to inlineformset factory.
"""
- response = self.client.get(self.change_url)
+ holder = Holder.objects.get(dummy=13)
+ response = self.client.get(
+ reverse('admin:admin_inlines_holder_change', args=(holder.id,))
+ )
inner_formset = response.context['inline_admin_formsets'][0].formset
expected = InnerInline.can_delete
actual = inner_formset.can_delete
@@ -51,13 +54,14 @@ class TestInline(TestCase):
"""Bug #13174."""
holder = Holder.objects.create(dummy=42)
Inner.objects.create(holder=holder, dummy=42, readonly='')
- response = self.client.get('/admin/admin_inlines/holder/%i/'
- % holder.id)
+ response = self.client.get(
+ reverse('admin:admin_inlines_holder_change', args=(holder.id,))
+ )
self.assertContains(response, '<label>Inner readonly label:</label>')
def test_many_to_many_inlines(self):
"Autogenerated many-to-many inlines are displayed correctly (#13407)"
- response = self.client.get('/admin/admin_inlines/author/add/')
+ response = self.client.get(reverse('admin:admin_inlines_author_add'))
# The heading for the m2m inline block uses the right text
self.assertContains(response, '<h2>Author-book relationships</h2>')
# The "add another" label is correct
@@ -78,7 +82,7 @@ class TestInline(TestCase):
'max_weight': 0,
'shoppingweakness_set-0-item': item.id,
}
- response = self.client.post('/admin/admin_inlines/fashionista/add/', data)
+ response = self.client.post(reverse('admin:admin_inlines_fashionista_add'), data)
self.assertEqual(response.status_code, 302)
self.assertEqual(len(Fashionista.objects.filter(person__firstname='Imelda')), 1)
@@ -95,7 +99,7 @@ class TestInline(TestCase):
'title_set-0-title1': 'a title',
'title_set-0-title2': 'a different title',
}
- response = self.client.post('/admin/admin_inlines/titlecollection/add/', data)
+ response = self.client.post(reverse('admin:admin_inlines_titlecollection_add'), data)
# Here colspan is "4": two fields (title1 and title2), one hidden field and the delete checkbox.
self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist nonfield"><li>The two titles must be the same</li></ul></td></tr>')
@@ -103,14 +107,14 @@ class TestInline(TestCase):
"""Admin inline `readonly_field` shouldn't invoke parent ModelAdmin callable"""
# Identically named callable isn't present in the parent ModelAdmin,
# rendering of the add view shouldn't explode
- response = self.client.get('/admin/admin_inlines/novel/add/')
+ response = self.client.get(reverse('admin:admin_inlines_novel_add'))
self.assertEqual(response.status_code, 200)
# View should have the child inlines section
self.assertContains(response, '<div class="inline-group" id="chapter_set-group">')
def test_callable_lookup(self):
"""Admin inline should invoke local callable when its name is listed in readonly_fields"""
- response = self.client.get('/admin/admin_inlines/poll/add/')
+ response = self.client.get(reverse('admin:admin_inlines_poll_add'))
self.assertEqual(response.status_code, 200)
# Add parent object view should have the child inlines section
self.assertContains(response, '<div class="inline-group" id="question_set-group">')
@@ -124,11 +128,11 @@ class TestInline(TestCase):
using both the stacked and tabular layouts.
Ref #8190.
"""
- response = self.client.get('/admin/admin_inlines/holder4/add/')
+ response = self.client.get(reverse('admin:admin_inlines_holder4_add'))
self.assertContains(response, '<p class="help">Awesome stacked help text is awesome.</p>', 4)
self.assertContains(response, '<img src="/static/admin/img/icon-unknown.gif" class="help help-tooltip" width="10" height="10" alt="(Awesome tabular help text is awesome.)" title="Awesome tabular help text is awesome." />', 1)
# ReadOnly fields
- response = self.client.get('/admin/admin_inlines/capofamiglia/add/')
+ response = self.client.get(reverse('admin:admin_inlines_capofamiglia_add'))
self.assertContains(response, '<img src="/static/admin/img/icon-unknown.gif" class="help help-tooltip" width="10" height="10" alt="(Help text for ReadOnlyInline)" title="Help text for ReadOnlyInline" />', 1)
def test_inline_hidden_field_no_column(self):
@@ -136,7 +140,7 @@ class TestInline(TestCase):
parent = SomeParentModel.objects.create(name='a')
SomeChildModel.objects.create(name='b', position='0', parent=parent)
SomeChildModel.objects.create(name='c', position='1', parent=parent)
- response = self.client.get('/admin/admin_inlines/someparentmodel/%s/' % parent.pk)
+ response = self.client.get(reverse('admin:admin_inlines_someparentmodel_change', args=(parent.pk,)))
self.assertNotContains(response, '<td class="field-position">')
self.assertContains(response, (
'<input id="id_somechildmodel_set-1-position" '
@@ -147,7 +151,7 @@ class TestInline(TestCase):
Ensure that multiple inlines with related_name='+' have correct form
prefixes. Bug #16838.
"""
- response = self.client.get('/admin/admin_inlines/capofamiglia/add/')
+ response = self.client.get(reverse('admin:admin_inlines_capofamiglia_add'))
self.assertContains(response,
'<input type="hidden" name="-1-0-id" id="id_-1-0-id" />', html=True)
@@ -173,7 +177,7 @@ class TestInline(TestCase):
"""
holder = Holder.objects.create(pk=123456789, dummy=42)
inner = Inner.objects.create(pk=987654321, holder=holder, dummy=42, readonly='')
- response = self.client.get('/admin/admin_inlines/holder/%i/' % holder.id)
+ response = self.client.get(reverse('admin:admin_inlines_holder_change', args=(holder.id,)))
inner_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(inner).pk, inner.pk)
self.assertContains(response, inner_shortcut)
@@ -185,7 +189,7 @@ class TestInline(TestCase):
parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo")
child1 = ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent)
child2 = ChildModel2.objects.create(my_own_pk="baz", name="Baz", parent=parent)
- response = self.client.get('/admin/admin_inlines/parentmodelwithcustompk/foo/')
+ response = self.client.get(reverse('admin:admin_inlines_parentmodelwithcustompk_change', args=('foo',)))
child1_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(child1).pk, child1.pk)
child2_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(child2).pk, child2.pk)
self.assertContains(response, child1_shortcut)
@@ -204,7 +208,7 @@ class TestInline(TestCase):
'sighting_set-0-place': 'Zone 51',
'_save': 'Save',
}
- response = self.client.post('/admin/admin_inlines/extraterrestrial/add/', data)
+ response = self.client.post(reverse('admin:admin_inlines_extraterrestrial_add'), data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Sighting.objects.filter(et__name='Martian').count(), 1)
@@ -218,11 +222,11 @@ class TestInline(TestCase):
# The total number of forms will remain the same in either case
total_forms_hidden = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="2" />'
- response = self.client.get('/admin/admin_inlines/binarytree/add/')
+ response = self.client.get(reverse('admin:admin_inlines_binarytree_add'))
self.assertContains(response, max_forms_input % 3)
self.assertContains(response, total_forms_hidden)
- response = self.client.get("/admin/admin_inlines/binarytree/%d/" % bt_head.id)
+ response = self.client.get(reverse('admin:admin_inlines_binarytree_change', args=(bt_head.id,)))
self.assertContains(response, max_forms_input % 2)
self.assertContains(response, total_forms_hidden)
@@ -241,7 +245,7 @@ class TestInline(TestCase):
min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="2" />'
total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="5" />'
- request = self.factory.get('/admin/admin_inlines/binarytree/add/')
+ request = self.factory.get(reverse('admin:admin_inlines_binarytree_add'))
request.user = User(username='super', is_superuser=True)
response = modeladmin.changeform_view(request)
self.assertContains(response, min_forms)
@@ -269,20 +273,20 @@ class TestInline(TestCase):
min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="%d" />'
total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="%d" />'
- request = self.factory.get('/admin/admin_inlines/binarytree/add/')
+ request = self.factory.get(reverse('admin:admin_inlines_binarytree_add'))
request.user = User(username='super', is_superuser=True)
response = modeladmin.changeform_view(request)
self.assertContains(response, min_forms % 2)
self.assertContains(response, total_forms % 5)
- request = self.factory.get("/admin/admin_inlines/binarytree/%d/" % bt_head.id)
+ request = self.factory.get(reverse('admin:admin_inlines_binarytree_change', args=(bt_head.id,)))
request.user = User(username='super', is_superuser=True)
response = modeladmin.changeform_view(request, object_id=str(bt_head.id))
self.assertContains(response, min_forms % 5)
self.assertContains(response, total_forms % 8)
def test_inline_nonauto_noneditable_pk(self):
- response = self.client.get('/admin/admin_inlines/author/add/')
+ response = self.client.get(reverse('admin:admin_inlines_author_add'))
self.assertContains(response,
'<input id="id_nonautopkbook_set-0-rand_pk" name="nonautopkbook_set-0-rand_pk" type="hidden" />',
html=True)
@@ -291,7 +295,7 @@ class TestInline(TestCase):
html=True)
def test_inline_editable_pk(self):
- response = self.client.get('/admin/admin_inlines/author/add/')
+ response = self.client.get(reverse('admin:admin_inlines_author_add'))
self.assertContains(response,
'<input class="vIntegerField" id="id_editablepkbook_set-0-manual_pk" name="editablepkbook_set-0-manual_pk" type="text" />',
html=True, count=1)
@@ -302,7 +306,7 @@ class TestInline(TestCase):
def test_stacked_inline_edit_form_contains_has_original_class(self):
holder = Holder.objects.create(dummy=1)
holder.inner_set.create(dummy=1)
- response = self.client.get('/admin/admin_inlines/holder/%s/' % holder.pk)
+ response = self.client.get(reverse('admin:admin_inlines_holder_change', args=(holder.pk,)))
self.assertContains(
response,
'<div class="inline-related has_original" id="inner_set-0">',
@@ -323,10 +327,10 @@ class TestInline(TestCase):
('inner4stacked', item1.pk),
('inner4tabular', item2.pk),
)
- response = self.client.get('/admin/admin_inlines/holder4/%s/' % holder.pk)
+ response = self.client.get(reverse('admin:admin_inlines_holder4_change', args=(holder.pk,)))
self.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model)
for model, pk in items:
- url = '/admin/admin_inlines/%s/%s/' % (model, pk)
+ url = reverse('admin:admin_inlines_%s_change' % model, args=(pk,))
self.assertContains(response, '<a href="%s" %s' % (url, INLINE_CHANGELINK_HTML))
def test_inlines_show_change_link_unregistered(self):
@@ -334,7 +338,7 @@ class TestInline(TestCase):
parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo")
ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent)
ChildModel2.objects.create(my_own_pk="baz", name="Baz", parent=parent)
- response = self.client.get('/admin/admin_inlines/parentmodelwithcustompk/foo/')
+ response = self.client.get(reverse('admin:admin_inlines_parentmodelwithcustompk_change', args=('foo',)))
self.assertFalse(response.context['inline_admin_formset'].opts.has_registered_model)
self.assertNotContains(response, INLINE_CHANGELINK_HTML)
@@ -342,7 +346,7 @@ class TestInline(TestCase):
"Inlines `show_change_link` disabled by default."
poll = Poll.objects.create(name="New poll")
Question.objects.create(poll=poll)
- response = self.client.get('/admin/admin_inlines/poll/%s/' % poll.pk)
+ response = self.client.get(reverse('admin:admin_inlines_poll_change', args=(poll.pk,)))
self.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model)
self.assertNotContains(response, INLINE_CHANGELINK_HTML)
@@ -361,7 +365,7 @@ class TestInlineMedia(TestCase):
holder = Holder(dummy=13)
holder.save()
Inner(dummy=42, holder=holder).save()
- change_url = '/admin/admin_inlines/holder/%i/' % holder.id
+ change_url = reverse('admin:admin_inlines_holder_change', args=(holder.id,))
response = self.client.get(change_url)
self.assertContains(response, 'my_awesome_admin_scripts.js')
@@ -369,7 +373,7 @@ class TestInlineMedia(TestCase):
holder = Holder3(dummy=13)
holder.save()
Inner3(dummy=42, holder=holder).save()
- change_url = '/admin/admin_inlines/holder3/%i/' % holder.id
+ change_url = reverse('admin:admin_inlines_holder3_change', args=(holder.id,))
response = self.client.get(change_url)
self.assertContains(response, 'my_awesome_inline_scripts.js')
@@ -377,7 +381,7 @@ class TestInlineMedia(TestCase):
holder = Holder2(dummy=13)
holder.save()
Inner2(dummy=42, holder=holder).save()
- change_url = '/admin/admin_inlines/holder2/%i/' % holder.id
+ change_url = reverse('admin:admin_inlines_holder2_change', args=(holder.id,))
response = self.client.get(change_url)
self.assertContains(response, 'my_awesome_admin_scripts.js')
self.assertContains(response, 'my_awesome_inline_scripts.js')
@@ -438,7 +442,7 @@ class TestInlineProtectedOnDelete(TestCase):
chapter = Chapter.objects.create(novel=lotr, name='Many Meetings')
foot_note = FootNote.objects.create(chapter=chapter, note='yadda yadda')
- change_url = '/admin/admin_inlines/novel/%i/' % lotr.id
+ change_url = reverse('admin:admin_inlines_novel_change', args=(lotr.id,))
response = self.client.get(change_url)
data = {
'name': lotr.name,
@@ -492,14 +496,14 @@ class TestInlinePermissions(TestCase):
author = Author.objects.create(pk=1, name='The Author')
book = author.books.create(name='The inline Book')
- self.author_change_url = '/admin/admin_inlines/author/%i/' % author.id
+ self.author_change_url = reverse('admin:admin_inlines_author_change', args=(author.id,))
# Get the ID of the automatically created intermediate model for the Author-Book m2m
author_book_auto_m2m_intermediate = Author.books.through.objects.get(author=author, book=book)
self.author_book_auto_m2m_intermediate_id = author_book_auto_m2m_intermediate.pk
holder = Holder2.objects.create(dummy=13)
inner2 = Inner2.objects.create(dummy=42, holder=holder)
- self.holder_change_url = '/admin/admin_inlines/holder2/%i/' % holder.id
+ self.holder_change_url = reverse('admin:admin_inlines_holder2_change', args=(holder.id,))
self.inner2_id = inner2.id
self.assertEqual(
@@ -507,14 +511,14 @@ class TestInlinePermissions(TestCase):
True)
def test_inline_add_m2m_noperm(self):
- response = self.client.get('/admin/admin_inlines/author/add/')
+ response = self.client.get(reverse('admin:admin_inlines_author_add'))
# No change permission on books, so no inline
self.assertNotContains(response, '<h2>Author-book relationships</h2>')
self.assertNotContains(response, 'Add another Author-Book Relationship')
self.assertNotContains(response, 'id="id_Author_books-TOTAL_FORMS"')
def test_inline_add_fk_noperm(self):
- response = self.client.get('/admin/admin_inlines/holder2/add/')
+ response = self.client.get(reverse('admin:admin_inlines_holder2_add'))
# No permissions on Inner2s, so no inline
self.assertNotContains(response, '<h2>Inner2s</h2>')
self.assertNotContains(response, 'Add another Inner2')
@@ -537,7 +541,7 @@ class TestInlinePermissions(TestCase):
def test_inline_add_m2m_add_perm(self):
permission = Permission.objects.get(codename='add_book', content_type=self.book_ct)
self.user.user_permissions.add(permission)
- response = self.client.get('/admin/admin_inlines/author/add/')
+ response = self.client.get(reverse('admin:admin_inlines_author_add'))
# No change permission on Books, so no inline
self.assertNotContains(response, '<h2>Author-book relationships</h2>')
self.assertNotContains(response, 'Add another Author-Book Relationship')
@@ -546,7 +550,7 @@ class TestInlinePermissions(TestCase):
def test_inline_add_fk_add_perm(self):
permission = Permission.objects.get(codename='add_inner2', content_type=self.inner_ct)
self.user.user_permissions.add(permission)
- response = self.client.get('/admin/admin_inlines/holder2/add/')
+ response = self.client.get(reverse('admin:admin_inlines_holder2_add'))
# Add permission on inner2s, so we get the inline
self.assertContains(response, '<h2>Inner2s</h2>')
self.assertContains(response, 'Add another Inner2')
@@ -666,7 +670,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
"""
self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin/admin_inlines/holder4/add/'))
+ reverse('admin:admin_inlines_holder4_add')))
inline_id = '#inner4stacked_set-group'
rows_length = lambda: len(self.selenium.find_elements_by_css_selector(
@@ -682,7 +686,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_delete_stackeds(self):
self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin/admin_inlines/holder4/add/'))
+ reverse('admin:admin_inlines_holder4_add')))
inline_id = '#inner4stacked_set-group'
rows_length = lambda: len(self.selenium.find_elements_by_css_selector(
@@ -707,7 +711,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
"""
self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin/admin_inlines/profilecollection/add/'))
+ reverse('admin:admin_inlines_profilecollection_add')))
# Check that there's only one inline to start with and that it has the
# correct ID.
@@ -764,7 +768,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_delete_inlines(self):
self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin/admin_inlines/profilecollection/add/'))
+ reverse('admin:admin_inlines_profilecollection_add')))
# Add a few inlines
self.selenium.find_element_by_link_text('Add another Profile').click()
@@ -802,7 +806,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_alternating_rows(self):
self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin/admin_inlines/profilecollection/add/'))
+ reverse('admin:admin_inlines_profilecollection_add')))
# Add a few inlines
self.selenium.find_element_by_link_text('Add another Profile').click()
diff --git a/tests/admin_views/customadmin.py b/tests/admin_views/customadmin.py
index 7941b7c897..644bbedae7 100644
--- a/tests/admin_views/customadmin.py
+++ b/tests/admin_views/customadmin.py
@@ -27,7 +27,7 @@ class Admin2(admin.AdminSite):
def get_urls(self):
return [
- url(r'^my_view/$', self.admin_view(self.my_view)),
+ url(r'^my_view/$', self.admin_view(self.my_view), name='my_view'),
] + super(Admin2, self).get_urls()
def my_view(self, request):
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 7faa2d4e4f..f4a2bc77e7 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -69,11 +69,6 @@ class AdminViewBasicTestCase(TestCase):
fixtures = ['admin-views-users.xml', 'admin-views-colors.xml',
'admin-views-fabrics.xml', 'admin-views-books.xml']
- # Store the bit of the URL where the admin is registered as a class
- # variable. That way we can test a second AdminSite just by subclassing
- # this test case and changing urlbit.
- urlbit = 'admin'
-
def setUp(self):
self.client.login(username='super', password='secret')
@@ -95,10 +90,9 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"""
If you leave off the trailing slash, app should redirect and add it.
"""
- response = self.client.get('/test_admin/%s/admin_views/article/add' % self.urlbit)
- self.assertRedirects(response,
- '/test_admin/%s/admin_views/article/add/' % self.urlbit,
- status_code=301)
+ add_url = reverse('admin:admin_views_article_add')
+ response = self.client.get(add_url[:-1])
+ self.assertRedirects(response, add_url, status_code=301)
def test_admin_static_template_tag(self):
"""
@@ -116,12 +110,12 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"""
A smoke test to ensure GET on the add_view works.
"""
- response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_section_add'))
self.assertIsInstance(response, TemplateResponse)
self.assertEqual(response.status_code, 200)
def test_add_with_GET_args(self):
- response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit, {'name': 'My Section'})
+ response = self.client.get(reverse('admin:admin_views_section_add'), {'name': 'My Section'})
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'value="My Section"',
msg_prefix="Couldn't find an input with the right value in the response")
@@ -130,7 +124,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"""
A smoke test to ensure GET on the change_view works.
"""
- response = self.client.get('/test_admin/%s/admin_views/section/1/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_section_change', args=(1,)))
self.assertIsInstance(response, TemplateResponse)
self.assertEqual(response.status_code, 200)
@@ -140,7 +134,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
#11191) when passing a string as the PK argument for a model with an
integer PK field.
"""
- response = self.client.get('/test_admin/%s/admin_views/section/abc/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_section_change', args=('abc',)))
self.assertEqual(response.status_code, 404)
def test_basic_inheritance_GET_string_PK(self):
@@ -149,7 +143,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
HTTP 404 error, see #19951) when passing a string as the PK argument
for a model with an integer PK field.
"""
- response = self.client.get('/test_admin/%s/admin_views/supervillain/abc/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_supervillain_change', args=('abc',)))
self.assertEqual(response.status_code, 404)
def test_basic_add_POST(self):
@@ -163,7 +157,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"article_set-INITIAL_FORMS": "0",
"article_set-MAX_NUM_FORMS": "0",
}
- response = self.client.post('/test_admin/%s/admin_views/section/add/' % self.urlbit, post_data)
+ response = self.client.post(reverse('admin:admin_views_section_add'), post_data)
self.assertEqual(response.status_code, 302) # redirect somewhere
def test_popup_add_POST(self):
@@ -177,7 +171,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
'date_0': '2010-09-10',
'date_1': '14:55:39',
}
- response = self.client.post('/test_admin/%s/admin_views/article/add/' % self.urlbit, post_data)
+ response = self.client.post(reverse('admin:admin_views_article_add'), post_data)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'dismissAddRelatedObjectPopup')
self.assertContains(response, 'title with a new\\u000Aline')
@@ -227,7 +221,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"""
A smoke test to ensure POST on edit_view works.
"""
- response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, self.inline_post_data)
+ response = self.client.post(reverse('admin:admin_views_section_change', args=(1,)), self.inline_post_data)
self.assertEqual(response.status_code, 302) # redirect somewhere
def test_edit_save_as(self):
@@ -243,7 +237,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"article_set-4-section": "1",
"article_set-5-section": "1",
})
- response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, post_data)
+ response = self.client.post(reverse('admin:admin_views_section_change', args=(1,)), post_data)
self.assertEqual(response.status_code, 302) # redirect somewhere
def test_edit_save_as_delete_inline(self):
@@ -258,7 +252,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"article_set-2-DELETE": "1",
"article_set-3-section": "1",
})
- response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, post_data)
+ response = self.client.post(reverse('admin:admin_views_section_change', args=(1,)), post_data)
self.assertEqual(response.status_code, 302)
# started with 3 articles, one was deleted.
self.assertEqual(Section.objects.latest('id').article_set.count(), 2)
@@ -268,7 +262,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
Ensure we can sort on a list_display field that is a callable
(column 2 is callable_year in ArticleAdmin)
"""
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': 2})
+ response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': 2})
self.assertContentBefore(response, 'Oldest content', 'Middle content',
"Results of sorting on callable are out of order.")
self.assertContentBefore(response, 'Middle content', 'Newest content',
@@ -279,7 +273,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
Ensure we can sort on a list_display field that is a Model method
(column 3 is 'model_year' in ArticleAdmin)
"""
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '-3'})
+ response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '-3'})
self.assertContentBefore(response, 'Newest content', 'Middle content',
"Results of sorting on Model method are out of order.")
self.assertContentBefore(response, 'Middle content', 'Oldest content',
@@ -290,7 +284,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
Ensure we can sort on a list_display field that is a ModelAdmin method
(column 4 is 'modeladmin_year' in ArticleAdmin)
"""
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '4'})
+ response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '4'})
self.assertContentBefore(response, 'Oldest content', 'Middle content',
"Results of sorting on ModelAdmin method are out of order.")
self.assertContentBefore(response, 'Middle content', 'Newest content',
@@ -302,14 +296,14 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
method in reverse order (i.e. admin_order_field uses the '-' prefix)
(column 6 is 'model_year_reverse' in ArticleAdmin)
"""
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '6'})
+ response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '6'})
self.assertContentBefore(response, '2009', '2008',
"Results of sorting on ModelAdmin method are out of order.")
self.assertContentBefore(response, '2008', '2000',
"Results of sorting on ModelAdmin method are out of order.")
# Let's make sure the ordering is right and that we don't get a
# FieldError when we change to descending order
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '-6'})
+ response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '-6'})
self.assertContentBefore(response, '2000', '2008',
"Results of sorting on ModelAdmin method are out of order.")
self.assertContentBefore(response, '2008', '2009',
@@ -324,14 +318,12 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
link3 = reverse('admin:admin_views_person_change', args=(p3.pk,))
# Sort by name, gender
- # This hard-codes the URL because it'll fail if it runs against the
- # 'admin2' custom admin (which doesn't have the Person model).
- response = self.client.get('/test_admin/admin/admin_views/person/', {'o': '1.2'})
+ response = self.client.get(reverse('admin:admin_views_person_changelist'), {'o': '1.2'})
self.assertContentBefore(response, link3, link1)
self.assertContentBefore(response, link1, link2)
# Sort by gender descending, name
- response = self.client.get('/test_admin/admin/admin_views/person/', {'o': '-2.1'})
+ response = self.client.get(reverse('admin:admin_views_person_changelist'), {'o': '-2.1'})
self.assertContentBefore(response, link2, link3)
self.assertContentBefore(response, link3, link1)
@@ -349,9 +341,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
link2 = reverse('admin:admin_views_person_change', args=(p2.pk,))
link3 = reverse('admin:admin_views_person_change', args=(p3.pk,))
- # This hard-codes the URL because it'll fail if it runs against the
- # 'admin2' custom admin (which doesn't have the Person model).
- response = self.client.get('/test_admin/admin/admin_views/person/', {})
+ response = self.client.get(reverse('admin:admin_views_person_changelist'), {})
self.assertContentBefore(response, link3, link2)
self.assertContentBefore(response, link2, link1)
@@ -363,11 +353,11 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
link1 = reverse('admin:admin_views_language_change', args=(quote(l1.pk),))
link2 = reverse('admin:admin_views_language_change', args=(quote(l2.pk),))
- response = self.client.get('/test_admin/admin/admin_views/language/', {})
+ response = self.client.get(reverse('admin:admin_views_language_changelist'), {})
self.assertContentBefore(response, link2, link1)
# Test we can override with query string
- response = self.client.get('/test_admin/admin/admin_views/language/', {'o': '-1'})
+ response = self.client.get(reverse('admin:admin_views_language_changelist'), {'o': '-1'})
self.assertContentBefore(response, link1, link2)
def test_change_list_sorting_override_model_admin(self):
@@ -378,7 +368,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
link1 = reverse('admin:admin_views_podcast_change', args=(p1.pk,))
link2 = reverse('admin:admin_views_podcast_change', args=(p2.pk,))
- response = self.client.get('/test_admin/admin/admin_views/podcast/', {})
+ response = self.client.get(reverse('admin:admin_views_podcast_changelist'), {})
self.assertContentBefore(response, link1, link2)
def test_multiple_sort_same_field(self):
@@ -390,7 +380,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
link1 = reverse('admin:admin_views_podcast_change', args=(quote(p1.pk),))
link2 = reverse('admin:admin_views_podcast_change', args=(quote(p2.pk),))
- response = self.client.get('/test_admin/admin/admin_views/podcast/', {})
+ response = self.client.get(reverse('admin:admin_views_podcast_changelist'), {})
self.assertContentBefore(response, link1, link2)
p1 = ComplexSortedPerson.objects.create(name="Bob", age=10)
@@ -398,7 +388,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
link1 = reverse('admin:admin_views_complexsortedperson_change', args=(p1.pk,))
link2 = reverse('admin:admin_views_complexsortedperson_change', args=(p2.pk,))
- response = self.client.get('/test_admin/admin/admin_views/complexsortedperson/', {})
+ response = self.client.get(reverse('admin:admin_views_complexsortedperson_changelist'), {})
# Should have 5 columns (including action checkbox col)
self.assertContains(response, '<th scope="col"', count=5)
@@ -425,7 +415,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
model.objects.create(stuff='The Last Item', order=3)
model.objects.create(stuff='The First Item', order=1)
model.objects.create(stuff='The Middle Item', order=2)
- response = self.client.get('/test_admin/admin/admin_views/%s/' % url, {})
+ response = self.client.get(reverse('admin:admin_views_%s_changelist' % url), {})
self.assertEqual(response.status_code, 200)
# Should have 3 columns including action checkbox col.
self.assertContains(response, '<th scope="col"', count=3, msg_prefix=url)
@@ -441,7 +431,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"""Ensure admin changelist filters do not contain objects excluded via limit_choices_to.
This also tests relation-spanning filters (e.g. 'color__value').
"""
- response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_thing_changelist'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, '<div id="changelist-filter">',
msg_prefix="Expected filter not found in changelist view")
@@ -449,8 +439,8 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
msg_prefix="Changelist filter not correctly limited by limit_choices_to")
def test_relation_spanning_filters(self):
- response = self.client.get('/test_admin/%s/admin_views/chapterxtra1/' %
- self.urlbit)
+ changelist_url = reverse('admin:admin_views_chapterxtra1_changelist')
+ response = self.client.get(changelist_url)
self.assertEqual(response.status_code, 200)
self.assertContains(response, '<div id="changelist-filter">')
filters = {
@@ -479,9 +469,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
# ensure filter link exists
self.assertContains(response, '<a href="?%s">' % query_string)
# ensure link works
- filtered_response = self.client.get(
- '/test_admin/%s/admin_views/chapterxtra1/?%s' % (
- self.urlbit, query_string))
+ filtered_response = self.client.get('%s?%s' % (changelist_url, query_string))
self.assertEqual(filtered_response.status_code, 200)
# ensure changelist contains only valid objects
for obj in filtered_response.context['cl'].queryset.all():
@@ -489,38 +477,40 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
def test_incorrect_lookup_parameters(self):
"""Ensure incorrect lookup parameters are handled gracefully."""
- response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'notarealfield': '5'})
- self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
+ changelist_url = reverse('admin:admin_views_thing_changelist')
+ response = self.client.get(changelist_url, {'notarealfield': '5'})
+ self.assertRedirects(response, '%s?e=1' % changelist_url)
# Spanning relationships through a nonexistent related object (Refs #16716)
- response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'notarealfield__whatever': '5'})
- self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
+ response = self.client.get(changelist_url, {'notarealfield__whatever': '5'})
+ self.assertRedirects(response, '%s?e=1' % changelist_url)
- response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'color__id__exact': 'StringNotInteger!'})
- self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
+ response = self.client.get(changelist_url, {'color__id__exact': 'StringNotInteger!'})
+ self.assertRedirects(response, '%s?e=1' % changelist_url)
# Regression test for #18530
- response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'pub_date__gte': 'foo'})
- self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit)
+ response = self.client.get(changelist_url, {'pub_date__gte': 'foo'})
+ self.assertRedirects(response, '%s?e=1' % changelist_url)
def test_isnull_lookups(self):
"""Ensure is_null is handled correctly."""
Article.objects.create(title="I Could Go Anywhere", content="Versatile", date=datetime.datetime.now())
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit)
+ changelist_url = reverse('admin:admin_views_article_changelist')
+ response = self.client.get(changelist_url)
self.assertContains(response, '4 articles')
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': 'false'})
+ response = self.client.get(changelist_url, {'section__isnull': 'false'})
self.assertContains(response, '3 articles')
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': '0'})
+ response = self.client.get(changelist_url, {'section__isnull': '0'})
self.assertContains(response, '3 articles')
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': 'true'})
+ response = self.client.get(changelist_url, {'section__isnull': 'true'})
self.assertContains(response, '1 article')
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': '1'})
+ response = self.client.get(changelist_url, {'section__isnull': '1'})
self.assertContains(response, '1 article')
def test_logout_and_password_change_URLs(self):
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit)
- self.assertContains(response, '<a href="/test_admin/%s/logout/">' % self.urlbit)
- self.assertContains(response, '<a href="/test_admin/%s/password_change/">' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_article_changelist'))
+ self.assertContains(response, '<a href="%s">' % reverse('admin:logout'))
+ self.assertContains(response, '<a href="%s">' % reverse('admin:password_change'))
def test_named_group_field_choices_change_list(self):
"""
@@ -528,9 +518,9 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
for rows corresponding to instances of a model in which a named group
has been used in the choices option of a field.
"""
- link1 = reverse('admin:admin_views_fabric_change', args=(1,), current_app=self.urlbit)
- link2 = reverse('admin:admin_views_fabric_change', args=(2,), current_app=self.urlbit)
- response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit)
+ link1 = reverse('admin:admin_views_fabric_change', args=(1,))
+ link2 = reverse('admin:admin_views_fabric_change', args=(2,))
+ response = self.client.get(reverse('admin:admin_views_fabric_changelist'))
fail_msg = "Changelist table isn't showing the right human-readable values set by a model field 'choices' option named group."
self.assertContains(response, '<a href="%s">Horizontal</a>' % link1, msg_prefix=fail_msg, html=True)
self.assertContains(response, '<a href="%s">Vertical</a>' % link2, msg_prefix=fail_msg, html=True)
@@ -540,7 +530,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
Ensures the filter UI shows correctly when at least one named group has
been used in the choices option of a model field.
"""
- response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_fabric_changelist'))
fail_msg = "Changelist filter isn't showing options contained inside a model field 'choices' option named group."
self.assertContains(response, '<div id="changelist-filter">')
self.assertContains(response,
@@ -550,10 +540,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
def test_change_list_null_boolean_display(self):
Post.objects.create(public=None)
- # This hard-codes the URl because it'll fail if it runs
- # against the 'admin2' custom admin (which doesn't have the
- # Post model).
- response = self.client.get("/test_admin/admin/admin_views/post/")
+ response = self.client.get(reverse('admin:admin_views_post_changelist'))
self.assertContains(response, 'icon-unknown.gif')
def test_i18n_language_non_english_default(self):
@@ -563,7 +550,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
is English. See #13388 and #3594 for more details.
"""
with self.settings(LANGUAGE_CODE='fr'), translation.override('en-us'):
- response = self.client.get('/test_admin/admin/jsi18n/')
+ response = self.client.get(reverse('admin:jsi18n'))
self.assertNotContains(response, 'Choisir une heure')
def test_i18n_language_non_english_fallback(self):
@@ -572,7 +559,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
in cases where the selected language cannot be found.
"""
with self.settings(LANGUAGE_CODE='fr'), translation.override('none'):
- response = self.client.get('/test_admin/admin/jsi18n/')
+ response = self.client.get(reverse('admin:jsi18n'))
self.assertContains(response, 'Choisir une heure')
def test_L10N_deactivated(self):
@@ -581,87 +568,91 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
return localized date/time formats. Refs #14824.
"""
with self.settings(LANGUAGE_CODE='ru', USE_L10N=False), translation.override('none'):
- response = self.client.get('/test_admin/admin/jsi18n/')
+ response = self.client.get(reverse('admin:jsi18n'))
self.assertNotContains(response, '%d.%m.%Y %H:%M:%S')
self.assertContains(response, '%Y-%m-%d %H:%M:%S')
def test_disallowed_filtering(self):
with patch_logger('django.security.DisallowedModelAdminLookup', 'error') as calls:
- response = self.client.get("/test_admin/admin/admin_views/album/?owner__email__startswith=fuzzy")
+ response = self.client.get(
+ "%s?owner__email__startswith=fuzzy" % reverse('admin:admin_views_album_changelist')
+ )
self.assertEqual(response.status_code, 400)
self.assertEqual(len(calls), 1)
# Filters are allowed if explicitly included in list_filter
- response = self.client.get("/test_admin/admin/admin_views/thing/?color__value__startswith=red")
+ response = self.client.get("%s?color__value__startswith=red" % reverse('admin:admin_views_thing_changelist'))
self.assertEqual(response.status_code, 200)
- response = self.client.get("/test_admin/admin/admin_views/thing/?color__value=red")
+ response = self.client.get("%s?color__value=red" % reverse('admin:admin_views_thing_changelist'))
self.assertEqual(response.status_code, 200)
# Filters should be allowed if they involve a local field without the
# need to whitelist them in list_filter or date_hierarchy.
- response = self.client.get("/test_admin/admin/admin_views/person/?age__gt=30")
+ response = self.client.get("%s?age__gt=30" % reverse('admin:admin_views_person_changelist'))
self.assertEqual(response.status_code, 200)
e1 = Employee.objects.create(name='Anonymous', gender=1, age=22, alive=True, code='123')
e2 = Employee.objects.create(name='Visitor', gender=2, age=19, alive=True, code='124')
WorkHour.objects.create(datum=datetime.datetime.now(), employee=e1)
WorkHour.objects.create(datum=datetime.datetime.now(), employee=e2)
- response = self.client.get("/test_admin/admin/admin_views/workhour/")
+ response = self.client.get(reverse('admin:admin_views_workhour_changelist'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'employee__person_ptr__exact')
- response = self.client.get("/test_admin/admin/admin_views/workhour/?employee__person_ptr__exact=%d" % e1.pk)
+ response = self.client.get("%s?employee__person_ptr__exact=%d" % (
+ reverse('admin:admin_views_workhour_changelist'), e1.pk)
+ )
self.assertEqual(response.status_code, 200)
def test_disallowed_to_field(self):
with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls:
- response = self.client.get("/test_admin/admin/admin_views/section/", {TO_FIELD_VAR: 'missing_field'})
+ response = self.client.get(reverse('admin:admin_views_section_changelist'), {TO_FIELD_VAR: 'missing_field'})
self.assertEqual(response.status_code, 400)
self.assertEqual(len(calls), 1)
# Specifying a field that is not referred by any other model registered
# to this admin site should raise an exception.
with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls:
- response = self.client.get("/test_admin/admin/admin_views/section/", {TO_FIELD_VAR: 'name'})
+ response = self.client.get(reverse('admin:admin_views_section_changelist'), {TO_FIELD_VAR: 'name'})
self.assertEqual(response.status_code, 400)
self.assertEqual(len(calls), 1)
# #23839 - Primary key should always be allowed, even if the referenced model isn't registered.
- response = self.client.get("/test_admin/admin/admin_views/notreferenced/", {TO_FIELD_VAR: 'id'})
+ response = self.client.get(reverse('admin:admin_views_notreferenced_changelist'), {TO_FIELD_VAR: 'id'})
self.assertEqual(response.status_code, 200)
# #23915 - Specifying a field referenced by another model though a m2m should be allowed.
- response = self.client.get("/test_admin/admin/admin_views/recipe/", {TO_FIELD_VAR: 'rname'})
+ response = self.client.get(reverse('admin:admin_views_recipe_changelist'), {TO_FIELD_VAR: 'rname'})
self.assertEqual(response.status_code, 200)
# #23604, #23915 - Specifying a field referenced through a reverse m2m relationship should be allowed.
- response = self.client.get("/test_admin/admin/admin_views/ingredient/", {TO_FIELD_VAR: 'iname'})
+ response = self.client.get(reverse('admin:admin_views_ingredient_changelist'), {TO_FIELD_VAR: 'iname'})
self.assertEqual(response.status_code, 200)
# #23329 - Specifying a field that is not referred by any other model directly registered
# to this admin site but registered through inheritance should be allowed.
- response = self.client.get("/test_admin/admin/admin_views/referencedbyparent/", {TO_FIELD_VAR: 'name'})
+ response = self.client.get(reverse('admin:admin_views_referencedbyparent_changelist'), {TO_FIELD_VAR: 'name'})
self.assertEqual(response.status_code, 200)
# #23431 - Specifying a field that is only referred to by a inline of a registered
# model should be allowed.
- response = self.client.get("/test_admin/admin/admin_views/referencedbyinline/", {TO_FIELD_VAR: 'name'})
+ response = self.client.get(reverse('admin:admin_views_referencedbyinline_changelist'), {TO_FIELD_VAR: 'name'})
self.assertEqual(response.status_code, 200)
# We also want to prevent the add, change, and delete views from
# leaking a disallowed field value.
with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls:
- response = self.client.post("/test_admin/admin/admin_views/section/add/", {TO_FIELD_VAR: 'name'})
+ response = self.client.post(reverse('admin:admin_views_section_add'), {TO_FIELD_VAR: 'name'})
self.assertEqual(response.status_code, 400)
self.assertEqual(len(calls), 1)
section = Section.objects.create()
with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls:
- response = self.client.post("/test_admin/admin/admin_views/section/%d/" % section.pk, {TO_FIELD_VAR: 'name'})
+ response = self.client.post(reverse('admin:admin_views_section_change', args=(section.pk,)), {TO_FIELD_VAR: 'name'})
self.assertEqual(response.status_code, 400)
self.assertEqual(len(calls), 1)
with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls:
- response = self.client.post("/test_admin/admin/admin_views/section/%d/delete/" % section.pk, {TO_FIELD_VAR: 'name'})
+ response = self.client.post(reverse('admin:admin_views_section_delete', args=(section.pk,)), {TO_FIELD_VAR: 'name'})
self.assertEqual(response.status_code, 400)
self.assertEqual(len(calls), 1)
@@ -672,7 +663,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
can break.
"""
# Filters should be allowed if they are defined on a ForeignKey pointing to this model
- response = self.client.get("/test_admin/admin/admin_views/inquisition/?leader__name=Palin&leader__age=27")
+ response = self.client.get("%s?leader__name=Palin&leader__age=27" % reverse('admin:admin_views_inquisition_changelist'))
self.assertEqual(response.status_code, 200)
def test_popup_dismiss_related(self):
@@ -680,7 +671,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
Regression test for ticket 20664 - ensure the pk is properly quoted.
"""
actor = Actor.objects.create(name="Palin", age=27)
- response = self.client.get("/test_admin/admin/admin_views/actor/?%s" % IS_POPUP_VAR)
+ response = self.client.get("%s?%s" % (reverse('admin:admin_views_actor_changelist'), IS_POPUP_VAR))
self.assertContains(response, "opener.dismissRelatedLookupPopup(window, &#39;%s&#39;)" % actor.pk)
def test_hide_change_password(self):
@@ -693,7 +684,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
user.set_unusable_password()
user.save()
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
self.assertNotContains(response, reverse('admin:password_change'),
msg_prefix='The "change password" link should not be displayed if a user does not have a usable password.')
@@ -704,8 +695,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
Refs #10057.
"""
instance = UndeletableObject.objects.create(name='foo')
- response = self.client.get('/test_admin/%s/admin_views/undeletableobject/%d/' %
- (self.urlbit, instance.pk))
+ response = self.client.get(reverse('admin:admin_views_undeletableobject_change', args=(instance.pk,)))
self.assertNotContains(response, 'deletelink')
def test_allows_attributeerror_to_bubble_up(self):
@@ -719,7 +709,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
"""
Simple.objects.create()
with self.assertRaises(AttributeError):
- self.client.get('/test_admin/%s/admin_views/simple/' % self.urlbit)
+ self.client.get(reverse('admin:admin_views_simple_changelist'))
def test_changelist_with_no_change_url(self):
"""
@@ -729,7 +719,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
Regression test for #20934
"""
UnchangeableObject.objects.create()
- response = self.client.get('/test_admin/admin/admin_views/unchangeableobject/')
+ response = self.client.get(reverse('admin:admin_views_unchangeableobject_changelist'))
self.assertEqual(response.status_code, 200)
# Check the format of the shown object -- shouldn't contain a change link
self.assertContains(response, '<th class="field-__str__">UnchangeableObject object</th>', html=True)
@@ -817,7 +807,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
Ensure that the admin/change_form.html template uses block.super in the
bodyclass block.
"""
- response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_section_add'))
self.assertContains(response, 'bodyclass_consistency_check ')
def test_extended_bodyclass_template_change_password(self):
@@ -826,7 +816,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
super in the bodyclass block.
"""
user = User.objects.get(username='super')
- response = self.client.get('/test_admin/%s/auth/user/%s/password/' % (self.urlbit, user.id))
+ response = self.client.get(reverse('admin:auth_user_password_change', args=(user.id,)))
self.assertContains(response, 'bodyclass_consistency_check ')
def test_extended_bodyclass_template_index(self):
@@ -834,7 +824,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
Ensure that the admin/index.html template uses block.super in the
bodyclass block.
"""
- response = self.client.get('/test_admin/%s/' % self.urlbit)
+ response = self.client.get(reverse('admin:index'))
self.assertContains(response, 'bodyclass_consistency_check ')
def test_extended_bodyclass_change_list(self):
@@ -842,7 +832,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
Ensure that the admin/change_list.html' template uses block.super
in the bodyclass block.
"""
- response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_article_changelist'))
self.assertContains(response, 'bodyclass_consistency_check ')
def test_extended_bodyclass_template_login(self):
@@ -851,7 +841,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
bodyclass block.
"""
self.client.logout()
- response = self.client.get('/test_admin/%s/login/' % self.urlbit)
+ response = self.client.get(reverse('admin:login'))
self.assertContains(response, 'bodyclass_consistency_check ')
def test_extended_bodyclass_template_delete_confirmation(self):
@@ -860,7 +850,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
block.super in the bodyclass block.
"""
group = Group.objects.create(name="foogroup")
- response = self.client.get('/test_admin/%s/auth/group/%s/delete/' % (self.urlbit, group.id))
+ response = self.client.get(reverse('admin:auth_group_delete', args=(group.id,)))
self.assertContains(response, 'bodyclass_consistency_check ')
def test_extended_bodyclass_template_delete_selected_confirmation(self):
@@ -875,7 +865,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
'index': '0',
'_selected_action': group.id
}
- response = self.client.post('/test_admin/%s/auth/group/' % (self.urlbit), post_data)
+ response = self.client.post(reverse('admin:auth_group_changelist'), post_data)
self.assertEqual(response.context['site_header'], 'Django administration')
self.assertContains(response, 'bodyclass_consistency_check ')
@@ -884,7 +874,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
Ensure that one can use a custom template to render an admin filter.
Refs #17515.
"""
- response = self.client.get("/test_admin/admin/admin_views/color2/")
+ response = self.client.get(reverse('admin:admin_views_color2_changelist'))
self.assertTemplateUsed(response, 'custom_filter_template.html')
@@ -892,7 +882,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase):
ROOT_URLCONF="admin_views.urls")
class AdminViewFormUrlTest(TestCase):
fixtures = ["admin-views-users.xml"]
- urlbit = "admin3"
+ current_app = "admin3"
def setUp(self):
self.client.login(username='super', password='secret')
@@ -901,7 +891,9 @@ class AdminViewFormUrlTest(TestCase):
"""
Tests whether change_view has form_url in response.context
"""
- response = self.client.get('/test_admin/%s/admin_views/section/1/' % self.urlbit)
+ response = self.client.get(
+ reverse('admin:admin_views_section_change', args=(1,), current_app=self.current_app)
+ )
self.assertIn('form_url', response.context, msg='form_url not present in response.context')
self.assertEqual(response.context['form_url'], 'pony')
@@ -912,7 +904,10 @@ class AdminViewFormUrlTest(TestCase):
Usually, the initial value is set via the GET params.
"""
- response = self.client.get('/test_admin/%s/admin_views/restaurant/add/' % self.urlbit, {'name': 'test_value'})
+ response = self.client.get(
+ reverse('admin:admin_views_restaurant_add', current_app=self.current_app),
+ {'name': 'test_value'}
+ )
# this would be the usual behaviour
self.assertNotContains(response, 'value="test_value"')
# this is the overridden behaviour
@@ -934,8 +929,7 @@ class AdminJavaScriptTest(TestCase):
Refs #17521.
"""
with override_settings(DEBUG=False):
- response = self.client.get(
- '/test_admin/%s/admin_views/section/add/' % 'admin')
+ response = self.client.get(reverse('admin:admin_views_section_add'))
self.assertNotContains(response, 'jquery.js')
self.assertContains(response, 'jquery.min.js')
self.assertNotContains(response, 'prepopulate.js')
@@ -947,8 +941,7 @@ class AdminJavaScriptTest(TestCase):
self.assertNotContains(response, 'inlines.js')
self.assertContains(response, 'inlines.min.js')
with override_settings(DEBUG=True):
- response = self.client.get(
- '/test_admin/%s/admin_views/section/add/' % 'admin')
+ response = self.client.get(reverse('admin:admin_views_section_add'))
self.assertContains(response, 'jquery.js')
self.assertNotContains(response, 'jquery.min.js')
self.assertContains(response, 'prepopulate.js')
@@ -972,7 +965,7 @@ class SaveAsTests(TestCase):
def test_save_as_duplication(self):
"""Ensure save as actually creates a new person"""
post_data = {'_saveasnew': '', 'name': 'John M', 'gender': 1, 'age': 42}
- self.client.post('/test_admin/admin/admin_views/person/1/', post_data)
+ self.client.post(reverse('admin:admin_views_person_change', args=(1,)), post_data)
self.assertEqual(len(Person.objects.filter(name='John M')), 1)
self.assertEqual(len(Person.objects.filter(id=1)), 1)
@@ -982,24 +975,24 @@ class SaveAsTests(TestCase):
invalid data aside save_as_new will not show us a form to overwrite the
initial model.
"""
- response = self.client.get('/test_admin/admin/admin_views/person/1/')
+ change_url = reverse('admin:admin_views_person_change', args=(1,))
+ response = self.client.get(change_url)
self.assertTrue(response.context['save_as'])
post_data = {'_saveasnew': '', 'name': 'John M', 'gender': 3, 'alive': 'checked'}
- response = self.client.post('/test_admin/admin/admin_views/person/1/', post_data)
- self.assertEqual(response.context['form_url'], '/test_admin/admin/admin_views/person/add/')
+ response = self.client.post(change_url, post_data)
+ self.assertEqual(response.context['form_url'], reverse('admin:admin_views_person_add'))
@override_settings(ROOT_URLCONF="admin_views.urls")
class CustomModelAdminTest(AdminViewBasicTestCase):
- urlbit = "admin2"
def test_custom_admin_site_login_form(self):
self.client.logout()
- response = self.client.get('/test_admin/admin2/', follow=True)
+ response = self.client.get(reverse('admin2:index'), follow=True)
self.assertIsInstance(response, TemplateResponse)
self.assertEqual(response.status_code, 200)
- login = self.client.post('/test_admin/admin2/login/', {
- REDIRECT_FIELD_NAME: '/test_admin/admin2/',
+ login = self.client.post(reverse('admin2:login'), {
+ REDIRECT_FIELD_NAME: reverse('admin2:index'),
'username': 'customform',
'password': 'secret',
}, follow=True)
@@ -1009,20 +1002,20 @@ class CustomModelAdminTest(AdminViewBasicTestCase):
def test_custom_admin_site_login_template(self):
self.client.logout()
- response = self.client.get('/test_admin/admin2/', follow=True)
+ response = self.client.get(reverse('admin2:index'), follow=True)
self.assertIsInstance(response, TemplateResponse)
self.assertTemplateUsed(response, 'custom_admin/login.html')
self.assertContains(response, 'Hello from a custom login template')
def test_custom_admin_site_logout_template(self):
- response = self.client.get('/test_admin/admin2/logout/')
+ response = self.client.get(reverse('admin2:logout'))
self.assertIsInstance(response, TemplateResponse)
self.assertTemplateUsed(response, 'custom_admin/logout.html')
self.assertContains(response, 'Hello from a custom logout template')
def test_custom_admin_site_index_view_and_template(self):
try:
- response = self.client.get('/test_admin/admin2/')
+ response = self.client.get(reverse('admin2:index'))
except TypeError:
self.fail('AdminSite.index_template should accept a list of template paths')
self.assertIsInstance(response, TemplateResponse)
@@ -1030,39 +1023,41 @@ class CustomModelAdminTest(AdminViewBasicTestCase):
self.assertContains(response, 'Hello from a custom index template *bar*')
def test_custom_admin_site_app_index_view_and_template(self):
- response = self.client.get('/test_admin/admin2/admin_views/')
+ response = self.client.get(reverse('admin2:app_list', args=('admin_views',)))
self.assertIsInstance(response, TemplateResponse)
self.assertTemplateUsed(response, 'custom_admin/app_index.html')
self.assertContains(response, 'Hello from a custom app_index template')
def test_custom_admin_site_password_change_template(self):
- response = self.client.get('/test_admin/admin2/password_change/')
+ response = self.client.get(reverse('admin2:password_change'))
self.assertIsInstance(response, TemplateResponse)
self.assertTemplateUsed(response, 'custom_admin/password_change_form.html')
self.assertContains(response, 'Hello from a custom password change form template')
def test_custom_admin_site_password_change_with_extra_context(self):
- response = self.client.get('/test_admin/admin2/password_change/')
+ response = self.client.get(reverse('admin2:password_change'))
self.assertIsInstance(response, TemplateResponse)
self.assertTemplateUsed(response, 'custom_admin/password_change_form.html')
self.assertContains(response, 'eggs')
def test_custom_admin_site_password_change_done_template(self):
- response = self.client.get('/test_admin/admin2/password_change/done/')
+ response = self.client.get(reverse('admin2:password_change_done'))
self.assertIsInstance(response, TemplateResponse)
self.assertTemplateUsed(response, 'custom_admin/password_change_done.html')
self.assertContains(response, 'Hello from a custom password change done template')
def test_custom_admin_site_view(self):
self.client.login(username='super', password='secret')
- response = self.client.get('/test_admin/%s/my_view/' % self.urlbit)
+ response = self.client.get(reverse('admin2:my_view'))
self.assertEqual(response.content, b"Django is a magical pony!")
def test_pwd_change_custom_template(self):
self.client.login(username='super', password='secret')
su = User.objects.get(username='super')
try:
- response = self.client.get('/test_admin/admin4/auth/user/%s/password/' % su.pk)
+ response = self.client.get(
+ reverse('admin4:auth_user_password_change', args=(su.pk,))
+ )
except TypeError:
self.fail('ModelAdmin.change_user_password_template should accept a list of template paths')
self.assertEqual(response.status_code, 200)
@@ -1111,48 +1106,49 @@ class AdminViewPermissionsTest(TestCase):
get_permission_codename('delete', Section._meta)))
# login POST dicts
+ self.index_url = reverse('admin:index')
self.super_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'username': 'super',
'password': 'secret',
}
self.super_email_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'username': 'super@example.com',
'password': 'secret',
}
self.super_email_bad_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'username': 'super@example.com',
'password': 'notsecret',
}
self.adduser_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'username': 'adduser',
'password': 'secret',
}
self.changeuser_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'username': 'changeuser',
'password': 'secret',
}
self.deleteuser_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'username': 'deleteuser',
'password': 'secret',
}
self.nostaff_login = {
- REDIRECT_FIELD_NAME: '/test_admin/has_permission_admin/',
+ REDIRECT_FIELD_NAME: reverse('has_permission_admin:index'),
'username': 'nostaff',
'password': 'secret',
}
self.joepublic_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'username': 'joepublic',
'password': 'secret',
}
self.no_username_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: self.index_url,
'password': 'secret',
}
@@ -1164,17 +1160,17 @@ class AdminViewPermissionsTest(TestCase):
Unsuccessful attempts will continue to render the login page with
a 200 status code.
"""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
# Super User
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
login = self.client.post(login_url, self.super_login)
- self.assertRedirects(login, '/test_admin/admin/')
+ self.assertRedirects(login, self.index_url)
self.assertFalse(login.context)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Test if user enters email address
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
login = self.client.post(login_url, self.super_email_login)
self.assertContains(login, ERROR_MESSAGE)
@@ -1188,38 +1184,38 @@ class AdminViewPermissionsTest(TestCase):
self.assertContains(login, ERROR_MESSAGE)
# Add User
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
login = self.client.post(login_url, self.adduser_login)
- self.assertRedirects(login, '/test_admin/admin/')
+ self.assertRedirects(login, self.index_url)
self.assertFalse(login.context)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Change User
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
login = self.client.post(login_url, self.changeuser_login)
- self.assertRedirects(login, '/test_admin/admin/')
+ self.assertRedirects(login, self.index_url)
self.assertFalse(login.context)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Delete User
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
login = self.client.post(login_url, self.deleteuser_login)
- self.assertRedirects(login, '/test_admin/admin/')
+ self.assertRedirects(login, self.index_url)
self.assertFalse(login.context)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Regular User should not be able to login.
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
login = self.client.post(login_url, self.joepublic_login)
self.assertEqual(login.status_code, 200)
self.assertContains(login, ERROR_MESSAGE)
# Requests without username should not return 500 errors.
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
login = self.client.post(login_url, self.no_username_login)
self.assertEqual(login.status_code, 200)
@@ -1228,37 +1224,37 @@ class AdminViewPermissionsTest(TestCase):
def test_login_has_permission(self):
# Regular User should not be able to login.
- response = self.client.get('/test_admin/has_permission_admin/')
+ response = self.client.get(reverse('has_permission_admin:index'))
self.assertEqual(response.status_code, 302)
- login = self.client.post('/test_admin/has_permission_admin/login/', self.joepublic_login)
+ login = self.client.post(reverse('has_permission_admin:login'), self.joepublic_login)
self.assertEqual(login.status_code, 200)
self.assertContains(login, 'permission denied')
# User with permissions should be able to login.
- response = self.client.get('/test_admin/has_permission_admin/')
+ response = self.client.get(reverse('has_permission_admin:index'))
self.assertEqual(response.status_code, 302)
- login = self.client.post('/test_admin/has_permission_admin/login/', self.nostaff_login)
- self.assertRedirects(login, '/test_admin/has_permission_admin/')
+ login = self.client.post(reverse('has_permission_admin:login'), self.nostaff_login)
+ self.assertRedirects(login, reverse('has_permission_admin:index'))
self.assertFalse(login.context)
- self.client.get('/test_admin/has_permission_admin/logout/')
+ self.client.get(reverse('has_permission_admin:logout'))
# Staff should be able to login.
- response = self.client.get('/test_admin/has_permission_admin/')
+ response = self.client.get(reverse('has_permission_admin:index'))
self.assertEqual(response.status_code, 302)
- login = self.client.post('/test_admin/has_permission_admin/login/', {
- REDIRECT_FIELD_NAME: '/test_admin/has_permission_admin/',
+ login = self.client.post(reverse('has_permission_admin:login'), {
+ REDIRECT_FIELD_NAME: reverse('has_permission_admin:index'),
'username': 'deleteuser',
'password': 'secret',
})
- self.assertRedirects(login, '/test_admin/has_permission_admin/')
+ self.assertRedirects(login, reverse('has_permission_admin:index'))
self.assertFalse(login.context)
- self.client.get('/test_admin/has_permission_admin/logout/')
+ self.client.get(reverse('has_permission_admin:logout'))
def test_login_successfully_redirects_to_original_URL(self):
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
query_string = 'the-answer=42'
- redirect_url = '/test_admin/admin/?%s' % query_string
+ redirect_url = '%s?%s' % (self.index_url, query_string)
new_next = {REDIRECT_FIELD_NAME: redirect_url}
post_data = self.super_login.copy()
post_data.pop(REDIRECT_FIELD_NAME)
@@ -1269,14 +1265,14 @@ class AdminViewPermissionsTest(TestCase):
def test_double_login_is_not_allowed(self):
"""Regression test for #19327"""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertEqual(response.status_code, 302)
# Establish a valid admin session
login = self.client.post(login_url, self.super_login)
- self.assertRedirects(login, '/test_admin/admin/')
+ self.assertRedirects(login, self.index_url)
self.assertFalse(login.context)
# Logging in with non-admin user fails
@@ -1286,67 +1282,67 @@ class AdminViewPermissionsTest(TestCase):
# Establish a valid admin session
login = self.client.post(login_url, self.super_login)
- self.assertRedirects(login, '/test_admin/admin/')
+ self.assertRedirects(login, self.index_url)
self.assertFalse(login.context)
# Logging in with admin user while already logged in
login = self.client.post(login_url, self.super_login)
- self.assertRedirects(login, '/test_admin/admin/')
+ self.assertRedirects(login, self.index_url)
self.assertFalse(login.context)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
def test_add_view(self):
"""Test add view restricts access and actually adds items."""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
add_dict = {'title': 'Døm ikke',
'content': '<p>great article</p>',
'date_0': '2008-03-18', 'date_1': '10:54:39',
'section': 1}
# Change User should not have access to add articles
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.changeuser_login)
# make sure the view removes test cookie
self.assertEqual(self.client.session.test_cookie_worked(), False)
- response = self.client.get('/test_admin/admin/admin_views/article/add/')
+ response = self.client.get(reverse('admin:admin_views_article_add'))
self.assertEqual(response.status_code, 403)
# Try POST just to make sure
- post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict)
+ post = self.client.post(reverse('admin:admin_views_article_add'), add_dict)
self.assertEqual(post.status_code, 403)
self.assertEqual(Article.objects.all().count(), 3)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Add user may login and POST to add view, then redirect to admin root
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.adduser_login)
- addpage = self.client.get('/test_admin/admin/admin_views/article/add/')
- change_list_link = '&rsaquo; <a href="/test_admin/admin/admin_views/article/">Articles</a>'
+ addpage = self.client.get(reverse('admin:admin_views_article_add'))
+ change_list_link = '&rsaquo; <a href="%s">Articles</a>' % reverse('admin:admin_views_article_changelist')
self.assertNotContains(addpage, change_list_link,
msg_prefix='User restricted to add permission is given link to change list view in breadcrumbs.')
- post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict)
- self.assertRedirects(post, '/test_admin/admin/')
+ post = self.client.post(reverse('admin:admin_views_article_add'), add_dict)
+ self.assertRedirects(post, self.index_url)
self.assertEqual(Article.objects.all().count(), 4)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Greetings from a created object')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Super can add too, but is redirected to the change list view
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.super_login)
- addpage = self.client.get('/test_admin/admin/admin_views/article/add/')
+ addpage = self.client.get(reverse('admin:admin_views_article_add'))
self.assertContains(addpage, change_list_link,
msg_prefix='Unrestricted user is not given link to change list view in breadcrumbs.')
- post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict)
- self.assertRedirects(post, '/test_admin/admin/admin_views/article/')
+ post = self.client.post(reverse('admin:admin_views_article_add'), add_dict)
+ self.assertRedirects(post, reverse('admin:admin_views_article_changelist'))
self.assertEqual(Article.objects.all().count(), 5)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# 8509 - if a normal user is already logged in, it is possible
# to change user into the superuser without error
self.client.login(username='joepublic', password='secret')
# Check and make sure that if user expires, data still persists
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.super_login)
# make sure the view removes test cookie
self.assertEqual(self.client.session.test_cookie_worked(), False)
@@ -1354,97 +1350,101 @@ class AdminViewPermissionsTest(TestCase):
def test_change_view(self):
"""Change view should restrict access and allow users to edit items."""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
change_dict = {'title': 'Ikke fordømt',
'content': '<p>edited article</p>',
'date_0': '2008-03-18', 'date_1': '10:54:39',
'section': 1}
+ article_change_url = reverse('admin:admin_views_article_change', args=(1,))
+ article_changelist_url = reverse('admin:admin_views_article_changelist')
# add user should not be able to view the list of article or change any of them
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.adduser_login)
- response = self.client.get('/test_admin/admin/admin_views/article/')
+ response = self.client.get(article_changelist_url)
self.assertEqual(response.status_code, 403)
- response = self.client.get('/test_admin/admin/admin_views/article/1/')
+ response = self.client.get(article_change_url)
self.assertEqual(response.status_code, 403)
- post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict)
+ post = self.client.post(article_change_url, change_dict)
self.assertEqual(post.status_code, 403)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# change user can view all items and edit them
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.changeuser_login)
- response = self.client.get('/test_admin/admin/admin_views/article/')
+ response = self.client.get(article_changelist_url)
self.assertEqual(response.status_code, 200)
- response = self.client.get('/test_admin/admin/admin_views/article/1/')
+ response = self.client.get(article_change_url)
self.assertEqual(response.status_code, 200)
- post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict)
- self.assertRedirects(post, '/test_admin/admin/admin_views/article/')
+ post = self.client.post(article_change_url, change_dict)
+ self.assertRedirects(post, article_changelist_url)
self.assertEqual(Article.objects.get(pk=1).content, '<p>edited article</p>')
# one error in form should produce singular error message, multiple errors plural
change_dict['title'] = ''
- post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict)
+ post = self.client.post(article_change_url, change_dict)
self.assertContains(post, 'Please correct the error below.',
msg_prefix='Singular error message not found in response to post with one error')
change_dict['content'] = ''
- post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict)
+ post = self.client.post(article_change_url, change_dict)
self.assertContains(post, 'Please correct the errors below.',
msg_prefix='Plural error message not found in response to post with multiple errors')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Test redirection when using row-level change permissions. Refs #11513.
- RowLevelChangePermissionModel.objects.create(id=1, name="odd id")
- RowLevelChangePermissionModel.objects.create(id=2, name="even id")
+ r1 = RowLevelChangePermissionModel.objects.create(id=1, name="odd id")
+ r2 = RowLevelChangePermissionModel.objects.create(id=2, name="even id")
+ change_url_1 = reverse('admin:admin_views_rowlevelchangepermissionmodel_change', args=(r1.pk,))
+ change_url_2 = reverse('admin:admin_views_rowlevelchangepermissionmodel_change', args=(r2.pk,))
for login_dict in [self.super_login, self.changeuser_login, self.adduser_login, self.deleteuser_login]:
self.client.post(login_url, login_dict)
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/')
+ response = self.client.get(change_url_1)
self.assertEqual(response.status_code, 403)
- response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/', {'name': 'changed'})
+ response = self.client.post(change_url_1, {'name': 'changed'})
self.assertEqual(RowLevelChangePermissionModel.objects.get(id=1).name, 'odd id')
self.assertEqual(response.status_code, 403)
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/')
+ response = self.client.get(change_url_2)
self.assertEqual(response.status_code, 200)
- response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/', {'name': 'changed'})
+ response = self.client.post(change_url_2, {'name': 'changed'})
self.assertEqual(RowLevelChangePermissionModel.objects.get(id=2).name, 'changed')
- self.assertRedirects(response, '/test_admin/admin/')
- self.client.get('/test_admin/admin/logout/')
+ self.assertRedirects(response, self.index_url)
+ self.client.get(reverse('admin:logout'))
for login_dict in [self.joepublic_login, self.no_username_login]:
self.client.post(login_url, login_dict)
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/', follow=True)
+ response = self.client.get(change_url_1, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'login-form')
- response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/', {'name': 'changed'}, follow=True)
+ response = self.client.post(change_url_1, {'name': 'changed'}, follow=True)
self.assertEqual(RowLevelChangePermissionModel.objects.get(id=1).name, 'odd id')
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'login-form')
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/', follow=True)
+ response = self.client.get(change_url_2, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'login-form')
- response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/', {'name': 'changed again'}, follow=True)
+ response = self.client.post(change_url_2, {'name': 'changed again'}, follow=True)
self.assertEqual(RowLevelChangePermissionModel.objects.get(id=2).name, 'changed')
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'login-form')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
def test_history_view(self):
"""History view should restrict access."""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
# add user should not be able to view the list of article or change any of them
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.adduser_login)
- response = self.client.get('/test_admin/admin/admin_views/article/1/history/')
+ response = self.client.get(reverse('admin:admin_views_article_history', args=(1,)))
self.assertEqual(response.status_code, 403)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# change user can view all items and edit them
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.changeuser_login)
- response = self.client.get('/test_admin/admin/admin_views/article/1/history/')
+ response = self.client.get(reverse('admin:admin_views_article_history', args=(1,)))
self.assertEqual(response.status_code, 200)
# Test redirection when using row-level change permissions. Refs #11513.
@@ -1452,33 +1452,37 @@ class AdminViewPermissionsTest(TestCase):
RowLevelChangePermissionModel.objects.create(id=2, name="even id")
for login_dict in [self.super_login, self.changeuser_login, self.adduser_login, self.deleteuser_login]:
self.client.post(login_url, login_dict)
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/')
+ response = self.client.get(reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(1,)))
self.assertEqual(response.status_code, 403)
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/')
+ response = self.client.get(reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(2,)))
self.assertEqual(response.status_code, 200)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
for login_dict in [self.joepublic_login, self.no_username_login]:
self.client.post(login_url, login_dict)
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/', follow=True)
+ response = self.client.get(
+ reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(1,)), follow=True
+ )
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'login-form')
- response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/', follow=True)
+ response = self.client.get(
+ reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(2,)), follow=True
+ )
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'login-form')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
def test_conditionally_show_add_section_link(self):
"""
The foreign key widget should only show the "add related" button if the
user has permission to add that related item.
"""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
# Set up and log in user.
- url = '/test_admin/admin/admin_views/article/add/'
+ url = reverse('admin:admin_views_article_add')
add_link_text = 'add_id_section'
self.client.post(login_url, self.adduser_login)
# The user can't add sections yet, so they shouldn't see the "add
@@ -1503,7 +1507,7 @@ class AdminViewPermissionsTest(TestCase):
login_url = reverse('admin:login')
# Set up and log in user.
- url = '/test_admin/admin/admin_views/article/add/'
+ url = reverse('admin:admin_views_article_add')
change_link_text = 'change_id_section'
self.client.post(login_url, self.adduser_login)
# The user can't change sections yet, so they shouldn't see the "change
@@ -1530,9 +1534,9 @@ class AdminViewPermissionsTest(TestCase):
login_url = reverse('admin:login')
# Set up and log in user.
- url = '/test_admin/admin/admin_views/article/add/'
+ url = reverse('admin:admin_views_article_add')
delete_link_text = 'delete_id_sub_section'
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.adduser_login)
# The user can't delete sections yet, so they shouldn't see the "delete
# section" link.
@@ -1549,85 +1553,86 @@ class AdminViewPermissionsTest(TestCase):
self.assertContains(response, delete_link_text)
def test_custom_model_admin_templates(self):
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
- self.client.get('/test_admin/admin/')
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
+ self.client.get(self.index_url)
self.client.post(login_url, self.super_login)
# Test custom change list template with custom extra context
- response = self.client.get('/test_admin/admin/admin_views/customarticle/')
+ response = self.client.get(reverse('admin:admin_views_customarticle_changelist'))
self.assertContains(response, "var hello = 'Hello!';")
self.assertTemplateUsed(response, 'custom_admin/change_list.html')
# Test custom add form template
- response = self.client.get('/test_admin/admin/admin_views/customarticle/add/')
+ response = self.client.get(reverse('admin:admin_views_customarticle_add'))
self.assertTemplateUsed(response, 'custom_admin/add_form.html')
# Add an article so we can test delete, change, and history views
- post = self.client.post('/test_admin/admin/admin_views/customarticle/add/', {
+ post = self.client.post(reverse('admin:admin_views_customarticle_add'), {
'content': '<p>great article</p>',
'date_0': '2008-03-18',
'date_1': '10:54:39'
})
- self.assertRedirects(post, '/test_admin/admin/admin_views/customarticle/')
+ self.assertRedirects(post, reverse('admin:admin_views_customarticle_changelist'))
self.assertEqual(CustomArticle.objects.all().count(), 1)
article_pk = CustomArticle.objects.all()[0].pk
# Test custom delete, change, and object history templates
# Test custom change form template
- response = self.client.get('/test_admin/admin/admin_views/customarticle/%d/' % article_pk)
+ response = self.client.get(reverse('admin:admin_views_customarticle_change', args=(article_pk,)))
self.assertTemplateUsed(response, 'custom_admin/change_form.html')
- response = self.client.get('/test_admin/admin/admin_views/customarticle/%d/delete/' % article_pk)
+ response = self.client.get(reverse('admin:admin_views_customarticle_delete', args=(article_pk,)))
self.assertTemplateUsed(response, 'custom_admin/delete_confirmation.html')
- response = self.client.post('/test_admin/admin/admin_views/customarticle/', data={
+ response = self.client.post(reverse('admin:admin_views_customarticle_changelist'), data={
'index': 0,
'action': ['delete_selected'],
'_selected_action': ['1'],
})
self.assertTemplateUsed(response, 'custom_admin/delete_selected_confirmation.html')
- response = self.client.get('/test_admin/admin/admin_views/customarticle/%d/history/' % article_pk)
+ response = self.client.get(reverse('admin:admin_views_customarticle_history', args=(article_pk,)))
self.assertTemplateUsed(response, 'custom_admin/object_history.html')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
def test_delete_view(self):
"""Delete view should restrict access and actually delete items."""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
delete_dict = {'post': 'yes'}
+ delete_url = reverse('admin:admin_views_article_delete', args=(1,))
# add user should not be able to delete articles
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.adduser_login)
- response = self.client.get('/test_admin/admin/admin_views/article/1/delete/')
+ response = self.client.get(delete_url)
self.assertEqual(response.status_code, 403)
- post = self.client.post('/test_admin/admin/admin_views/article/1/delete/', delete_dict)
+ post = self.client.post(delete_url, delete_dict)
self.assertEqual(post.status_code, 403)
self.assertEqual(Article.objects.all().count(), 3)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
# Delete user can delete
- self.client.get('/test_admin/admin/')
+ self.client.get(self.index_url)
self.client.post(login_url, self.deleteuser_login)
- response = self.client.get('/test_admin/admin/admin_views/section/1/delete/')
+ response = self.client.get(reverse('admin:admin_views_section_delete', args=(1,)))
self.assertContains(response, "<h2>Summary</h2>")
self.assertContains(response, "<li>Articles: 3</li>")
# test response contains link to related Article
self.assertContains(response, "admin_views/article/1/")
- response = self.client.get('/test_admin/admin/admin_views/article/1/delete/')
+ response = self.client.get(delete_url)
self.assertContains(response, "admin_views/article/1/")
self.assertContains(response, "<h2>Summary</h2>")
self.assertContains(response, "<li>Articles: 1</li>")
self.assertEqual(response.status_code, 200)
- post = self.client.post('/test_admin/admin/admin_views/article/1/delete/', delete_dict)
- self.assertRedirects(post, '/test_admin/admin/')
+ post = self.client.post(delete_url, delete_dict)
+ self.assertRedirects(post, self.index_url)
self.assertEqual(Article.objects.all().count(), 2)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Greetings from a deleted object')
article_ct = ContentType.objects.get_for_model(Article)
logged = LogEntry.objects.get(content_type=article_ct, action_flag=DELETION)
self.assertEqual(logged.object_id, '1')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
def test_disabled_permissions_when_logged_in(self):
self.client.login(username='super', password='secret')
@@ -1635,11 +1640,11 @@ class AdminViewPermissionsTest(TestCase):
superuser.is_active = False
superuser.save()
- response = self.client.get('/test_admin/admin/', follow=True)
+ response = self.client.get(self.index_url, follow=True)
self.assertContains(response, 'id="login-form"')
self.assertNotContains(response, 'Log out')
- response = self.client.get('/test_admin/admin/secure-view/', follow=True)
+ response = self.client.get(reverse('secure_view'), follow=True)
self.assertContains(response, 'id="login-form"')
def test_disabled_staff_permissions_when_logged_in(self):
@@ -1648,11 +1653,11 @@ class AdminViewPermissionsTest(TestCase):
superuser.is_staff = False
superuser.save()
- response = self.client.get('/test_admin/admin/', follow=True)
+ response = self.client.get(self.index_url, follow=True)
self.assertContains(response, 'id="login-form"')
self.assertNotContains(response, 'Log out')
- response = self.client.get('/test_admin/admin/secure-view/', follow=True)
+ response = self.client.get(reverse('secure_view'), follow=True)
self.assertContains(response, 'id="login-form"')
def test_app_index_fail_early(self):
@@ -1660,7 +1665,7 @@ class AdminViewPermissionsTest(TestCase):
If a user has no module perms, avoid iterating over all the modeladmins
in the registry.
"""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
opts = Article._meta
change_user = User.objects.get(username='changeuser')
permission = get_perm(Article, get_permission_codename('change', opts))
@@ -1669,12 +1674,12 @@ class AdminViewPermissionsTest(TestCase):
# the user has no module permissions, because this module doesn't exist
change_user.user_permissions.remove(permission)
- response = self.client.get('/test_admin/admin/admin_views/')
+ response = self.client.get(reverse('admin:app_list', args=('admin_views',)))
self.assertEqual(response.status_code, 403)
# the user now has module permissions
change_user.user_permissions.add(permission)
- response = self.client.get('/test_admin/admin/admin_views/')
+ response = self.client.get(reverse('admin:app_list', args=('admin_views',)))
self.assertEqual(response.status_code, 200)
def test_shortcut_view_only_available_to_staff(self):
@@ -1683,7 +1688,7 @@ class AdminViewPermissionsTest(TestCase):
"""
model_ctype = ContentType.objects.get_for_model(ModelWithStringPrimaryKey)
obj = ModelWithStringPrimaryKey.objects.create(string_pk='foo')
- shortcut_url = "/test_admin/admin/r/%s/%s/" % (model_ctype.pk, obj.pk)
+ shortcut_url = reverse('admin:view_on_site', args=(model_ctype.pk, obj.pk))
# Not logged in: we should see the login page.
response = self.client.get(shortcut_url, follow=True)
@@ -1703,31 +1708,31 @@ class AdminViewPermissionsTest(TestCase):
have any permission for that module (add, change, or delete), so that
the module is displayed on the admin index page.
"""
- login_url = reverse('admin:login') + '?next=/test_admin/admin/'
+ login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index'))
self.client.post(login_url, self.super_login)
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertContains(response, 'admin_views')
self.assertContains(response, 'Articles')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
self.client.post(login_url, self.adduser_login)
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertContains(response, 'admin_views')
self.assertContains(response, 'Articles')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
self.client.post(login_url, self.changeuser_login)
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertContains(response, 'admin_views')
self.assertContains(response, 'Articles')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
self.client.post(login_url, self.deleteuser_login)
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(self.index_url)
self.assertContains(response, 'admin_views')
self.assertContains(response, 'Articles')
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
def test_overriding_has_module_permission(self):
"""
@@ -1735,31 +1740,32 @@ class AdminViewPermissionsTest(TestCase):
In this case, it always returns False, so the module should not be
displayed on the admin index page for any users.
"""
- login_url = reverse('admin:login') + '?next=/test_admin/admin7/'
+ login_url = '%s?next=%s' % (reverse('admin7:login'), reverse('admin7:index'))
+ index_url = reverse('admin7:index')
self.client.post(login_url, self.super_login)
- response = self.client.get('/test_admin/admin7/')
+ response = self.client.get(index_url)
self.assertNotContains(response, 'admin_views')
self.assertNotContains(response, 'Articles')
- self.client.get('/test_admin/admin7/logout/')
+ self.client.get(reverse('admin7:logout'))
self.client.post(login_url, self.adduser_login)
- response = self.client.get('/test_admin/admin7/')
+ response = self.client.get(index_url)
self.assertNotContains(response, 'admin_views')
self.assertNotContains(response, 'Articles')
- self.client.get('/test_admin/admin7/logout/')
+ self.client.get(reverse('admin7:logout'))
self.client.post(login_url, self.changeuser_login)
- response = self.client.get('/test_admin/admin7/')
+ response = self.client.get(index_url)
self.assertNotContains(response, 'admin_views')
self.assertNotContains(response, 'Articles')
- self.client.get('/test_admin/admin7/logout/')
+ self.client.get(reverse('admin7:logout'))
self.client.post(login_url, self.deleteuser_login)
- response = self.client.get('/test_admin/admin7/')
+ response = self.client.get(index_url)
self.assertNotContains(response, 'admin_views')
self.assertNotContains(response, 'Articles')
- self.client.get('/test_admin/admin7/logout/')
+ self.client.get(reverse('admin7:logout'))
@override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
@@ -1778,19 +1784,19 @@ class AdminViewsNoUrlTest(TestCase):
# login POST dict
self.changeuser_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: reverse('admin:index'),
'username': 'changeuser',
'password': 'secret',
}
def test_no_standard_modeladmin_urls(self):
"""Admin index views don't break when user's ModelAdmin removes standard urls"""
- self.client.get('/test_admin/admin/')
+ self.client.get(reverse('admin:index'))
r = self.client.post(reverse('admin:login'), self.changeuser_login)
- r = self.client.get('/test_admin/admin/')
+ r = self.client.get(reverse('admin:index'))
# we shouldn't get a 500 error caused by a NoReverseMatch
self.assertEqual(r.status_code, 200)
- self.client.get('/test_admin/admin/logout/')
+ self.client.get(reverse('admin:logout'))
@skipUnlessDBFeature('can_defer_constraint_checks')
@@ -1807,8 +1813,12 @@ class AdminViewDeletedObjectsTest(TestCase):
Objects should be nested to display the relationships that
cause them to be scheduled for deletion.
"""
- pattern = re.compile(br"""<li>Plot: <a href=".+/admin_views/plot/1/">World Domination</a>\s*<ul>\s*<li>Plot details: <a href=".+/admin_views/plotdetails/1/">almost finished</a>""")
- response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(1))
+ pattern = re.compile(force_bytes(
+ r'<li>Plot: <a href="%s">World Domination</a>\s*<ul>\s*<li>Plot details: <a href="%s">almost finished</a>' % (
+ reverse('admin:admin_views_plot_change', args=(1,)),
+ reverse('admin:admin_views_plotdetails_change', args=(1,)))
+ ))
+ response = self.client.get(reverse('admin:admin_views_villain_delete', args=(1,)))
six.assertRegex(self, response.content, pattern)
def test_cyclic(self):
@@ -1817,9 +1827,13 @@ class AdminViewDeletedObjectsTest(TestCase):
listed once.
"""
- one = """<li>Cyclic one: <a href="/test_admin/admin/admin_views/cyclicone/1/">I am recursive</a>"""
- two = """<li>Cyclic two: <a href="/test_admin/admin/admin_views/cyclictwo/1/">I am recursive too</a>"""
- response = self.client.get('/test_admin/admin/admin_views/cyclicone/%s/delete/' % quote(1))
+ one = '<li>Cyclic one: <a href="%s">I am recursive</a>' % (
+ reverse('admin:admin_views_cyclicone_change', args=(1,)),
+ )
+ two = '<li>Cyclic two: <a href="%s">I am recursive too</a>' % (
+ reverse('admin:admin_views_cyclictwo_change', args=(1,)),
+ )
+ response = self.client.get(reverse('admin:admin_views_cyclicone_delete', args=(1,)))
self.assertContains(response, one, 1)
self.assertContains(response, two, 1)
@@ -1833,7 +1847,7 @@ class AdminViewDeletedObjectsTest(TestCase):
self.assertTrue(self.client.login(username='deleteuser',
password='secret'))
- response = self.client.get('/test_admin/admin/admin_views/plot/%s/delete/' % quote(1))
+ response = self.client.get(reverse('admin:admin_views_plot_delete', args=(1,)))
self.assertContains(response, "your account doesn't have permission to delete the following types of objects")
self.assertContains(response, "<li>plot details</li>")
@@ -1842,14 +1856,20 @@ class AdminViewDeletedObjectsTest(TestCase):
a1 = Answer.objects.create(question=q, answer="Because.")
a2 = Answer.objects.create(question=q, answer="Yes.")
- response = self.client.get("/test_admin/admin/admin_views/question/%s/delete/" % quote(q.pk))
+ response = self.client.get(reverse('admin:admin_views_question_delete', args=(q.pk,)))
self.assertContains(response, "would require deleting the following protected related objects")
- self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Because.</a></li>' % a1.pk)
- self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Yes.</a></li>' % a2.pk)
+ self.assertContains(
+ response,
+ '<li>Answer: <a href="%s">Because.</a></li>' % reverse('admin:admin_views_answer_change', args=(a1.pk,))
+ )
+ self.assertContains(
+ response,
+ '<li>Answer: <a href="%s">Yes.</a></li>' % reverse('admin:admin_views_answer_change', args=(a2.pk,))
+ )
def test_not_registered(self):
should_contain = """<li>Secret hideout: underground bunker"""
- response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(1))
+ response = self.client.get(reverse('admin:admin_views_villain_delete', args=(1,)))
self.assertContains(response, should_contain, 1)
def test_multiple_fkeys_to_same_model(self):
@@ -1859,10 +1879,12 @@ class AdminViewDeletedObjectsTest(TestCase):
objects to delete.
"""
- should_contain = """<li>Plot: <a href="/test_admin/admin/admin_views/plot/1/">World Domination</a>"""
- response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(1))
+ should_contain = '<li>Plot: <a href="%s">World Domination</a>' % reverse(
+ 'admin:admin_views_plot_change', args=(1,)
+ )
+ response = self.client.get(reverse('admin:admin_views_villain_delete', args=(1,)))
self.assertContains(response, should_contain)
- response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(2))
+ response = self.client.get(reverse('admin:admin_views_villain_delete', args=(2,)))
self.assertContains(response, should_contain)
def test_multiple_fkeys_to_same_instance(self):
@@ -1872,8 +1894,10 @@ class AdminViewDeletedObjectsTest(TestCase):
once.
"""
- should_contain = """<li>Plot: <a href="/test_admin/admin/admin_views/plot/2/">World Peace</a></li>"""
- response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(2))
+ should_contain = '<li>Plot: <a href="%s">World Peace</a></li>' % reverse(
+ 'admin:admin_views_plot_change', args=(2,)
+ )
+ response = self.client.get(reverse('admin:admin_views_villain_delete', args=(2,)))
self.assertContains(response, should_contain, 1)
def test_inheritance(self):
@@ -1884,15 +1908,15 @@ class AdminViewDeletedObjectsTest(TestCase):
"""
should_contain = [
- """<li>Villain: <a href="/test_admin/admin/admin_views/villain/3/">Bob</a>""",
- """<li>Super villain: <a href="/test_admin/admin/admin_views/supervillain/3/">Bob</a>""",
- """<li>Secret hideout: floating castle""",
- """<li>Super secret hideout: super floating castle!"""
+ '<li>Villain: <a href="%s">Bob</a>' % reverse('admin:admin_views_villain_change', args=(3,)),
+ '<li>Super villain: <a href="%s">Bob</a>' % reverse('admin:admin_views_supervillain_change', args=(3,)),
+ '<li>Secret hideout: floating castle',
+ '<li>Super secret hideout: super floating castle!',
]
- response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(3))
+ response = self.client.get(reverse('admin:admin_views_villain_delete', args=(3,)))
for should in should_contain:
self.assertContains(response, should, 1)
- response = self.client.get('/test_admin/admin/admin_views/supervillain/%s/delete/' % quote(3))
+ response = self.client.get(reverse('admin:admin_views_supervillain_delete', args=(3,)))
for should in should_contain:
self.assertContains(response, should, 1)
@@ -1904,8 +1928,9 @@ class AdminViewDeletedObjectsTest(TestCase):
"""
plot = Plot.objects.get(pk=3)
tag = FunkyTag.objects.create(content_object=plot, name='hott')
- should_contain = """<li>Funky tag: <a href="/test_admin/admin/admin_views/funkytag/%s/">hott""" % tag.id
- response = self.client.get('/test_admin/admin/admin_views/plot/%s/delete/' % quote(3))
+ should_contain = '<li>Funky tag: <a href="%s">hott' % reverse(
+ 'admin:admin_views_funkytag_change', args=(tag.id,))
+ response = self.client.get(reverse('admin:admin_views_plot_delete', args=(3,)))
self.assertContains(response, should_contain)
@@ -1920,7 +1945,7 @@ class TestGenericRelations(TestCase):
def test_generic_content_object_in_list_display(self):
plot = Plot.objects.get(pk=3)
FunkyTag.objects.create(content_object=plot, name='hott')
- response = self.client.get('/test_admin/admin/admin_views/funkytag/')
+ response = self.client.get(reverse('admin:admin_views_funkytag_changelist'))
self.assertContains(response, "%s</td>" % plot)
@@ -1944,36 +1969,38 @@ class AdminViewStringPrimaryKeyTest(TestCase):
key should work.
Refs #12349, #18550.
"""
- response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/history/' % quote(self.pk))
+ response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_history', args=(self.pk,)))
self.assertContains(response, escape(self.pk))
self.assertContains(response, 'Changed something')
self.assertEqual(response.status_code, 200)
def test_get_change_view(self):
"Retrieving the object using urlencoded form of primary key should work"
- response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(self.pk))
+ response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_change', args=(self.pk,)))
self.assertContains(response, escape(self.pk))
self.assertEqual(response.status_code, 200)
def test_changelist_to_changeform_link(self):
"Link to the changeform of the object in changelist should use reverse() and be quoted -- #18072"
- prefix = '/test_admin/admin/admin_views/modelwithstringprimarykey/'
- response = self.client.get(prefix)
+ response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_changelist'))
# this URL now comes through reverse(), thus url quoting and iri_to_uri encoding
pk_final_url = escape(iri_to_uri(quote(self.pk)))
- should_contain = """<th class="field-__str__"><a href="%s%s/">%s</a></th>""" % (prefix, pk_final_url, escape(self.pk))
+ change_url = reverse(
+ 'admin:admin_views_modelwithstringprimarykey_change', args=('__fk__',)
+ ).replace('__fk__', pk_final_url)
+ should_contain = '<th class="field-__str__"><a href="%s">%s</a></th>' % (change_url, escape(self.pk))
self.assertContains(response, should_contain)
def test_recentactions_link(self):
"The link from the recent actions list referring to the changeform of the object should be quoted"
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
link = reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(self.pk),))
should_contain = """<a href="%s">%s</a>""" % (escape(link), escape(self.pk))
self.assertContains(response, should_contain)
def test_recentactions_without_content_type(self):
"If a LogEntry is missing content_type it will not display it in span tag under the hyperlink."
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
link = reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(self.pk),))
should_contain = """<a href="%s">%s</a>""" % (escape(link), escape(self.pk))
self.assertContains(response, should_contain)
@@ -1987,7 +2014,7 @@ class AdminViewStringPrimaryKeyTest(TestCase):
logentry.save()
counted_presence_before = response.content.count(force_bytes(should_contain))
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
counted_presence_after = response.content.count(force_bytes(should_contain))
self.assertEqual(counted_presence_before - 1,
counted_presence_after)
@@ -1996,25 +2023,31 @@ class AdminViewStringPrimaryKeyTest(TestCase):
"LogEntry.get_admin_url returns a URL to edit the entry's object or None for non-existent (possibly deleted) models"
log_entry_model = "modelwithstringprimarykey" # capitalized in Recent Actions
logentry = LogEntry.objects.get(content_type__model__iexact=log_entry_model)
- model = "modelwithstringprimarykey"
- desired_admin_url = "/test_admin/admin/admin_views/%s/%s/" % (model, iri_to_uri(quote(self.pk)))
+ desired_admin_url = reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(self.pk),))
+
self.assertEqual(logentry.get_admin_url(), desired_admin_url)
+ self.assertIn(iri_to_uri(quote(self.pk)), logentry.get_admin_url())
logentry.content_type.model = "non-existent"
self.assertEqual(logentry.get_admin_url(), None)
def test_deleteconfirmation_link(self):
"The link from the delete confirmation page referring back to the changeform of the object should be quoted"
- response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/delete/' % quote(self.pk))
+ response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_delete', args=(quote(self.pk),)))
# this URL now comes through reverse(), thus url quoting and iri_to_uri encoding
- should_contain = """/%s/">%s</a>""" % (escape(iri_to_uri(quote(self.pk))), escape(self.pk))
+ change_url = reverse(
+ 'admin:admin_views_modelwithstringprimarykey_change', args=('__fk__',)
+ ).replace('__fk__', escape(iri_to_uri(quote(self.pk))))
+ should_contain = '<a href="%s">%s</a>' % (change_url, escape(self.pk))
self.assertContains(response, should_contain)
def test_url_conflicts_with_add(self):
"A model with a primary key that ends with add should be visible"
add_model = ModelWithStringPrimaryKey(pk="i have something to add")
add_model.save()
- response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(add_model.pk))
+ response = self.client.get(
+ reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(add_model.pk),))
+ )
should_contain = """<h1>Change model with string primary key</h1>"""
self.assertContains(response, should_contain)
@@ -2022,7 +2055,9 @@ class AdminViewStringPrimaryKeyTest(TestCase):
"A model with a primary key that ends with delete should be visible"
delete_model = ModelWithStringPrimaryKey(pk="delete")
delete_model.save()
- response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(delete_model.pk))
+ response = self.client.get(
+ reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(delete_model.pk),))
+ )
should_contain = """<h1>Change model with string primary key</h1>"""
self.assertContains(response, should_contain)
@@ -2030,7 +2065,9 @@ class AdminViewStringPrimaryKeyTest(TestCase):
"A model with a primary key that ends with history should be visible"
history_model = ModelWithStringPrimaryKey(pk="history")
history_model.save()
- response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(history_model.pk))
+ response = self.client.get(
+ reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(history_model.pk),))
+ )
should_contain = """<h1>Change model with string primary key</h1>"""
self.assertContains(response, should_contain)
@@ -2038,7 +2075,9 @@ class AdminViewStringPrimaryKeyTest(TestCase):
"'View on site should' work properly with char fields"
model = ModelWithStringPrimaryKey(pk='abc_123')
model.save()
- response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(model.pk))
+ response = self.client.get(
+ reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(model.pk),))
+ )
should_contain = '/%s/" class="viewsitelink">' % model.pk
self.assertContains(response, should_contain)
@@ -2062,7 +2101,7 @@ class AdminViewStringPrimaryKeyTest(TestCase):
like slash or underscore, these characters must be escaped (see #22266)
"""
response = self.client.post(
- '/test_admin/admin/admin_views/modelwithstringprimarykey/add/',
+ reverse('admin:admin_views_modelwithstringprimarykey_add'),
{
'string_pk': '123/history',
"_continue": "1", # Save and continue editing
@@ -2070,13 +2109,7 @@ class AdminViewStringPrimaryKeyTest(TestCase):
)
self.assertEqual(response.status_code, 302) # temporary redirect
- self.assertEqual(
- response['location'],
- (
- 'http://testserver/test_admin/admin/admin_views/'
- 'modelwithstringprimarykey/123_2Fhistory/' # PK is quoted
- )
- )
+ self.assertIn('/123_2Fhistory/', response['location']) # PK is quoted
@override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
@@ -2091,7 +2124,7 @@ class SecureViewTests(TestCase):
"""
Ensure that we see the admin login form.
"""
- secure_url = '/test_admin/admin/secure-view/'
+ secure_url = reverse('secure_view')
response = self.client.get(secure_url)
self.assertRedirects(response, '%s?next=%s' % (reverse('admin:login'), secure_url))
response = self.client.get(secure_url, follow=True)
@@ -2137,7 +2170,7 @@ class AdminViewUnicodeTest(TestCase):
"chapter_set-5-content": "",
}
- response = self.client.post('/test_admin/admin/admin_views/book/1/', post_data)
+ response = self.client.post(reverse('admin:admin_views_book_change', args=(1,)), post_data)
self.assertEqual(response.status_code, 302) # redirect somewhere
def test_unicode_delete(self):
@@ -2145,10 +2178,11 @@ class AdminViewUnicodeTest(TestCase):
Ensure that the delete_view handles non-ASCII characters
"""
delete_dict = {'post': 'yes'}
- response = self.client.get('/test_admin/admin/admin_views/book/1/delete/')
+ delete_url = reverse('admin:admin_views_book_delete', args=(1,))
+ response = self.client.get(delete_url)
self.assertEqual(response.status_code, 200)
- response = self.client.post('/test_admin/admin/admin_views/book/1/delete/', delete_dict)
- self.assertRedirects(response, '/test_admin/admin/admin_views/book/')
+ response = self.client.post(delete_url, delete_dict)
+ self.assertRedirects(response, reverse('admin:admin_views_book_changelist'))
@override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
@@ -2162,21 +2196,21 @@ class AdminViewListEditable(TestCase):
def test_inheritance(self):
Podcast.objects.create(name="This Week in Django",
release_date=datetime.date.today())
- response = self.client.get('/test_admin/admin/admin_views/podcast/')
+ response = self.client.get(reverse('admin:admin_views_podcast_changelist'))
self.assertEqual(response.status_code, 200)
def test_inheritance_2(self):
Vodcast.objects.create(name="This Week in Django", released=True)
- response = self.client.get('/test_admin/admin/admin_views/vodcast/')
+ response = self.client.get(reverse('admin:admin_views_vodcast_changelist'))
self.assertEqual(response.status_code, 200)
def test_custom_pk(self):
Language.objects.create(iso='en', name='English', english_name='English')
- response = self.client.get('/test_admin/admin/admin_views/language/')
+ response = self.client.get(reverse('admin:admin_views_language_changelist'))
self.assertEqual(response.status_code, 200)
def test_changelist_input_html(self):
- response = self.client.get('/test_admin/admin/admin_views/person/')
+ response = self.client.get(reverse('admin:admin_views_person_changelist'))
# 2 inputs per object(the field and the hidden id field) = 6
# 4 management hidden fields = 4
# 4 action inputs (3 regular checkboxes, 1 checkbox to select all)
@@ -2209,7 +2243,7 @@ class AdminViewListEditable(TestCase):
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/person/',
+ response = self.client.post(reverse('admin:admin_views_person_changelist'),
data, follow=True)
self.assertEqual(len(response.context['messages']), 1)
@@ -2231,7 +2265,7 @@ class AdminViewListEditable(TestCase):
"_save": "Save",
}
- self.client.post('/test_admin/admin/admin_views/person/', data)
+ self.client.post(reverse('admin:admin_views_person_changelist'), data)
self.assertEqual(Person.objects.get(name="John Mauchly").alive, False)
self.assertEqual(Person.objects.get(name="Grace Hopper").gender, 2)
@@ -2252,7 +2286,7 @@ class AdminViewListEditable(TestCase):
"_save": "Save",
}
- self.client.post('/test_admin/admin/admin_views/person/?gender__exact=1', data)
+ self.client.post(reverse('admin:admin_views_person_changelist') + '?gender__exact=1', data)
self.assertEqual(Person.objects.get(name="John Mauchly").alive, True)
@@ -2267,7 +2301,7 @@ class AdminViewListEditable(TestCase):
"_save": "Save",
}
- self.client.post('/test_admin/admin/admin_views/person/?q=john', data)
+ self.client.post(reverse('admin:admin_views_person_changelist') + '?q=john', data)
self.assertEqual(Person.objects.get(name="John Mauchly").alive, False)
@@ -2302,8 +2336,14 @@ class AdminViewListEditable(TestCase):
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/fooddelivery/', data)
- self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 1, html=True)
+ response = self.client.post(reverse('admin:admin_views_fooddelivery_changelist'), data)
+ self.assertContains(
+ response,
+ '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery '
+ 'with this Driver and Restaurant already exists.</li></ul></td></tr>',
+ 1,
+ html=True
+ )
data = {
"form-TOTAL_FORMS": "3",
@@ -2329,8 +2369,14 @@ class AdminViewListEditable(TestCase):
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/fooddelivery/', data)
- self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 2, html=True)
+ response = self.client.post(reverse('admin:admin_views_fooddelivery_changelist'), data)
+ self.assertContains(
+ response,
+ '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery '
+ 'with this Driver and Restaurant already exists.</li></ul></td></tr>',
+ 2,
+ html=True
+ )
def test_non_form_errors(self):
# test if non-form errors are handled; ticket #12716
@@ -2347,7 +2393,7 @@ class AdminViewListEditable(TestCase):
# and not an action "Go".
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/person/', data)
+ response = self.client.post(reverse('admin:admin_views_person_changelist'), data)
self.assertContains(response, "Grace is not a Zombie")
def test_non_form_errors_is_errorlist(self):
@@ -2363,7 +2409,7 @@ class AdminViewListEditable(TestCase):
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/person/', data)
+ response = self.client.post(reverse('admin:admin_views_person_changelist'), data)
non_form_errors = response.context['cl'].formset.non_form_errors()
self.assertIsInstance(non_form_errors, ErrorList)
self.assertEqual(str(non_form_errors), str(ErrorList(["Grace is not a Zombie"])))
@@ -2402,7 +2448,7 @@ class AdminViewListEditable(TestCase):
# and not an action "Go".
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/category/', data)
+ response = self.client.post(reverse('admin:admin_views_category_changelist'), data)
# Successful post will redirect
self.assertEqual(response.status_code, 302)
@@ -2420,11 +2466,11 @@ class AdminViewListEditable(TestCase):
UnorderedObject.objects.create(id=1, name='Unordered object #1')
UnorderedObject.objects.create(id=2, name='Unordered object #2')
UnorderedObject.objects.create(id=3, name='Unordered object #3')
- response = self.client.get('/test_admin/admin/admin_views/unorderedobject/')
+ response = self.client.get(reverse('admin:admin_views_unorderedobject_changelist'))
self.assertContains(response, 'Unordered object #3')
self.assertContains(response, 'Unordered object #2')
self.assertNotContains(response, 'Unordered object #1')
- response = self.client.get('/test_admin/admin/admin_views/unorderedobject/?p=1')
+ response = self.client.get(reverse('admin:admin_views_unorderedobject_changelist') + '?p=1')
self.assertNotContains(response, 'Unordered object #3')
self.assertNotContains(response, 'Unordered object #2')
self.assertContains(response, 'Unordered object #1')
@@ -2451,7 +2497,7 @@ class AdminViewListEditable(TestCase):
"_selected_action": ['3'],
"action": ['', 'delete_selected'],
}
- self.client.post('/test_admin/admin/admin_views/person/', data)
+ self.client.post(reverse('admin:admin_views_person_changelist'), data)
self.assertEqual(Person.objects.get(name="John Mauchly").alive, True)
self.assertEqual(Person.objects.get(name="Grace Hopper").gender, 1)
@@ -2478,7 +2524,7 @@ class AdminViewListEditable(TestCase):
"_selected_action": ['1'],
"action": ['', 'delete_selected'],
}
- self.client.post('/test_admin/admin/admin_views/person/', data)
+ self.client.post(reverse('admin:admin_views_person_changelist'), data)
self.assertEqual(Person.objects.get(name="John Mauchly").alive, False)
self.assertEqual(Person.objects.get(name="Grace Hopper").gender, 2)
@@ -2487,9 +2533,9 @@ class AdminViewListEditable(TestCase):
"""
Fields should not be list-editable in popups.
"""
- response = self.client.get('/test_admin/admin/admin_views/person/')
+ response = self.client.get(reverse('admin:admin_views_person_changelist'))
self.assertNotEqual(response.context['cl'].list_editable, ())
- response = self.client.get('/test_admin/admin/admin_views/person/?%s' % IS_POPUP_VAR)
+ response = self.client.get(reverse('admin:admin_views_person_changelist') + '?%s' % IS_POPUP_VAR)
self.assertEqual(response.context['cl'].list_editable, ())
def test_pk_hidden_fields(self):
@@ -2501,7 +2547,7 @@ class AdminViewListEditable(TestCase):
"""
story1 = Story.objects.create(title='The adventures of Guido', content='Once upon a time in Djangoland...')
story2 = Story.objects.create(title='Crouching Tiger, Hidden Python', content='The Python was sneaking into...')
- response = self.client.get('/test_admin/admin/admin_views/story/')
+ response = self.client.get(reverse('admin:admin_views_story_changelist'))
self.assertContains(response, 'id="id_form-0-id"', 1) # Only one hidden field, in a separate place than the table.
self.assertContains(response, 'id="id_form-1-id"', 1)
self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id), html=True)
@@ -2517,7 +2563,7 @@ class AdminViewListEditable(TestCase):
story2 = OtherStory.objects.create(title='Crouching Tiger, Hidden Python', content='The Python was sneaking into...')
link1 = reverse('admin:admin_views_otherstory_change', args=(story1.pk,))
link2 = reverse('admin:admin_views_otherstory_change', args=(story2.pk,))
- response = self.client.get('/test_admin/admin/admin_views/otherstory/')
+ response = self.client.get(reverse('admin:admin_views_otherstory_changelist'))
self.assertContains(response, 'id="id_form-0-id"', 1) # Only one hidden field, in a separate place than the table.
self.assertContains(response, 'id="id_form-1-id"', 1)
self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id), html=True)
@@ -2536,34 +2582,35 @@ class AdminSearchTest(TestCase):
def test_search_on_sibling_models(self):
"Check that a search that mentions sibling models"
- response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar')
+ response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=bar')
# confirm the search returned 1 object
self.assertContains(response, "\n1 recommendation\n")
def test_with_fk_to_field(self):
- """Ensure that the to_field GET parameter is preserved when a search
+ """
+ Ensure that the to_field GET parameter is preserved when a search
is performed. Refs #10918.
"""
- response = self.client.get('/test_admin/admin/auth/user/?q=joe&%s=id' % TO_FIELD_VAR)
+ response = self.client.get(reverse('admin:auth_user_changelist') + '?q=joe&%s=id' % TO_FIELD_VAR)
self.assertContains(response, "\n1 user\n")
self.assertContains(response, '<input type="hidden" name="%s" value="id"/>' % TO_FIELD_VAR, html=True)
def test_exact_matches(self):
- response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar')
+ response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=bar')
# confirm the search returned one object
self.assertContains(response, "\n1 recommendation\n")
- response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=ba')
+ response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=ba')
# confirm the search returned zero objects
self.assertContains(response, "\n0 recommendations\n")
def test_beginning_matches(self):
- response = self.client.get('/test_admin/admin/admin_views/person/?q=Gui')
+ response = self.client.get(reverse('admin:admin_views_person_changelist') + '?q=Gui')
# confirm the search returned one object
self.assertContains(response, "\n1 person\n")
self.assertContains(response, "Guido")
- response = self.client.get('/test_admin/admin/admin_views/person/?q=uido')
+ response = self.client.get(reverse('admin:admin_views_person_changelist') + '?q=uido')
# confirm the search returned zero objects
self.assertContains(response, "\n0 persons\n")
self.assertNotContains(response, "Guido")
@@ -2572,12 +2619,12 @@ class AdminSearchTest(TestCase):
PluggableSearchPerson.objects.create(name="Bob", age=10)
PluggableSearchPerson.objects.create(name="Amy", age=20)
- response = self.client.get('/test_admin/admin/admin_views/pluggablesearchperson/?q=Bob')
+ response = self.client.get(reverse('admin:admin_views_pluggablesearchperson_changelist') + '?q=Bob')
# confirm the search returned one object
self.assertContains(response, "\n1 pluggable search person\n")
self.assertContains(response, "Bob")
- response = self.client.get('/test_admin/admin/admin_views/pluggablesearchperson/?q=20')
+ response = self.client.get(reverse('admin:admin_views_pluggablesearchperson_changelist') + '?q=20')
# confirm the search returned one object
self.assertContains(response, "\n1 pluggable search person\n")
self.assertContains(response, "Amy")
@@ -2590,7 +2637,7 @@ class AdminSearchTest(TestCase):
# + 1 for filtered result + 1 for filtered count
# + 1 for total count
with self.assertNumQueries(5):
- response = self.client.get('/test_admin/admin/admin_views/person/?q=Gui')
+ response = self.client.get(reverse('admin:admin_views_person_changelist') + '?q=Gui')
self.assertContains(response,
"""<span class="small quiet">1 result (<a href="?">3 total</a>)</span>""",
html=True)
@@ -2603,7 +2650,7 @@ class AdminSearchTest(TestCase):
# 1 query for session + 1 for fetching user
# + 1 for filtered result + 1 for filtered count
with self.assertNumQueries(4):
- response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar')
+ response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=bar')
self.assertContains(response,
"""<span class="small quiet">1 result (<a href="?">Show all</a>)</span>""",
html=True)
@@ -2626,7 +2673,7 @@ class AdminInheritedInlinesTest(TestCase):
name_re = re.compile(b'name="(.*?)"')
# test the add case
- response = self.client.get('/test_admin/admin/admin_views/persona/add/')
+ response = self.client.get(reverse('admin:admin_views_persona_add'))
names = name_re.findall(response.content)
# make sure we have no duplicate HTML names
self.assertEqual(len(names), len(set(names)))
@@ -2645,7 +2692,7 @@ class AdminInheritedInlinesTest(TestCase):
"accounts-2-0-username": bar_user,
}
- response = self.client.post('/test_admin/admin/admin_views/persona/add/', post_data)
+ response = self.client.post(reverse('admin:admin_views_persona_add'), post_data)
self.assertEqual(response.status_code, 302) # redirect somewhere
self.assertEqual(Persona.objects.count(), 1)
self.assertEqual(FooAccount.objects.count(), 1)
@@ -2660,7 +2707,7 @@ class AdminInheritedInlinesTest(TestCase):
# test the edit case
- response = self.client.get('/test_admin/admin/admin_views/persona/%d/' % persona_id)
+ response = self.client.get(reverse('admin:admin_views_persona_change', args=(persona_id,)))
names = name_re.findall(response.content)
# make sure we have no duplicate HTML names
self.assertEqual(len(names), len(set(names)))
@@ -2684,7 +2731,7 @@ class AdminInheritedInlinesTest(TestCase):
"accounts-2-0-account_ptr": str(bar_id),
"accounts-2-0-persona": str(persona_id),
}
- response = self.client.post('/test_admin/admin/admin_views/persona/%d/' % persona_id, post_data)
+ response = self.client.post(reverse('admin:admin_views_persona_change', args=(persona_id,)), post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Persona.objects.count(), 1)
self.assertEqual(FooAccount.objects.count(), 1)
@@ -2709,7 +2756,7 @@ class AdminActionsTest(TestCase):
'action': 'mail_admin',
'index': 0,
}
- self.client.post('/test_admin/admin/admin_views/subscriber/', action_data)
+ self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Greetings from a ModelAdmin action')
@@ -2725,14 +2772,14 @@ class AdminActionsTest(TestCase):
'action': 'delete_selected',
'post': 'yes',
}
- confirmation = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data)
+ confirmation = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data)
self.assertIsInstance(confirmation, TemplateResponse)
self.assertContains(confirmation, "Are you sure you want to delete the selected subscribers?")
self.assertContains(confirmation, "<h2>Summary</h2>")
self.assertContains(confirmation, "<li>Subscribers: 3</li>")
self.assertContains(confirmation, "<li>External subscribers: 1</li>")
self.assertContains(confirmation, ACTION_CHECKBOX_NAME, count=2)
- self.client.post('/test_admin/admin/admin_views/subscriber/', delete_confirmation_data)
+ self.client.post(reverse('admin:admin_views_subscriber_changelist'), delete_confirmation_data)
self.assertEqual(Subscriber.objects.count(), 0)
@override_settings(USE_THOUSAND_SEPARATOR=True, USE_L10N=True)
@@ -2749,7 +2796,7 @@ class AdminActionsTest(TestCase):
'action': 'delete_selected',
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data)
+ response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data)
self.assertTemplateUsed(response, 'admin/delete_selected_confirmation.html')
self.assertContains(response, 'value="9999"') # Instead of 9,999
self.assertContains(response, 'value="2"')
@@ -2770,11 +2817,19 @@ class AdminActionsTest(TestCase):
'index': 0,
}
- response = self.client.post("/test_admin/admin/admin_views/question/", action_data)
+ response = self.client.post(reverse('admin:admin_views_question_changelist'), action_data)
self.assertContains(response, "would require deleting the following protected related objects")
- self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Because.</a></li>' % a1.pk, html=True)
- self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Yes.</a></li>' % a2.pk, html=True)
+ self.assertContains(
+ response,
+ '<li>Answer: <a href="%s">Because.</a></li>' % reverse('admin:admin_views_answer_change', args=(a1.pk,)),
+ html=True
+ )
+ self.assertContains(
+ response,
+ '<li>Answer: <a href="%s">Yes.</a></li>' % reverse('admin:admin_views_answer_change', args=(a2.pk,)),
+ html=True
+ )
def test_model_admin_default_delete_action_no_change_url(self):
"""
@@ -2788,7 +2843,7 @@ class AdminActionsTest(TestCase):
"action": "delete_selected",
"index": "0",
}
- response = self.client.post('/test_admin/admin/admin_views/unchangeableobject/', action_data)
+ response = self.client.post(reverse('admin:admin_views_unchangeableobject_changelist'), action_data)
# No 500 caused by NoReverseMatch
self.assertEqual(response.status_code, 200)
# The page shouldn't display a link to the nonexistent change page
@@ -2801,7 +2856,7 @@ class AdminActionsTest(TestCase):
'action': 'external_mail',
'index': 0,
}
- self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data)
+ self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Greetings from a function action')
@@ -2812,7 +2867,7 @@ class AdminActionsTest(TestCase):
'action': 'redirect_to',
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data)
+ response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data)
self.assertEqual(response.status_code, 302)
def test_default_redirect(self):
@@ -2826,7 +2881,7 @@ class AdminActionsTest(TestCase):
'action': 'external_mail',
'index': 0,
}
- url = '/test_admin/admin/admin_views/externalsubscriber/?o=1'
+ url = reverse('admin:admin_views_externalsubscriber_changelist') + '?o=1'
response = self.client.post(url, action_data)
self.assertRedirects(response, url)
@@ -2837,7 +2892,7 @@ class AdminActionsTest(TestCase):
'action': 'download',
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data)
+ response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data)
content = b''.join(response.streaming_content)
self.assertEqual(content, b'This is the content of the file')
self.assertEqual(response.status_code, 200)
@@ -2849,7 +2904,7 @@ class AdminActionsTest(TestCase):
'action': 'no_perm',
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data)
+ response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data)
self.assertEqual(response.status_code, 403)
self.assertEqual(response.content, b'No permission to perform this action')
@@ -2858,7 +2913,7 @@ class AdminActionsTest(TestCase):
Ensure that actions are ordered as expected.
Refs #15964.
"""
- response = self.client.get('/test_admin/admin/admin_views/externalsubscriber/')
+ response = self.client.get(reverse('admin:admin_views_externalsubscriber_changelist'))
self.assertContains(response, '''<label>Action: <select name="action">
<option value="" selected="selected">---------</option>
<option value="delete_selected">Delete selected external
@@ -2872,7 +2927,7 @@ action)</option>
def test_model_without_action(self):
"Tests a ModelAdmin without any action"
- response = self.client.get('/test_admin/admin/admin_views/oldsubscriber/')
+ response = self.client.get(reverse('admin:admin_views_oldsubscriber_changelist'))
self.assertEqual(response.context["action_form"], None)
self.assertNotContains(response, '<input type="checkbox" class="action-select"',
msg_prefix="Found an unexpected action toggle checkboxbox in response")
@@ -2880,14 +2935,14 @@ action)</option>
def test_model_without_action_still_has_jquery(self):
"Tests that a ModelAdmin without any actions still gets jQuery included in page"
- response = self.client.get('/test_admin/admin/admin_views/oldsubscriber/')
+ response = self.client.get(reverse('admin:admin_views_oldsubscriber_changelist'))
self.assertEqual(response.context["action_form"], None)
self.assertContains(response, 'jquery.min.js',
msg_prefix="jQuery missing from admin pages for model with no admin actions")
def test_action_column_class(self):
"Tests that the checkbox column class is present in the response"
- response = self.client.get('/test_admin/admin/admin_views/subscriber/')
+ response = self.client.get(reverse('admin:admin_views_subscriber_changelist'))
self.assertNotEqual(response.context["action_form"], None)
self.assertContains(response, 'action-checkbox-column')
@@ -2902,7 +2957,7 @@ action)</option>
# ...but we clicked "go" on the top form.
'index': 0
}
- self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data)
+ self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data)
# Send mail, don't delete.
self.assertEqual(len(mail.outbox), 1)
@@ -2917,7 +2972,7 @@ action)</option>
'action': 'delete_selected',
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data)
+ response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data)
msg = """Items must be selected in order to perform actions on them. No items have been changed."""
self.assertContains(response, msg)
self.assertEqual(Subscriber.objects.count(), 2)
@@ -2931,7 +2986,7 @@ action)</option>
'action': '',
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data)
+ response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data)
msg = """No action selected."""
self.assertContains(response, msg)
self.assertEqual(Subscriber.objects.count(), 2)
@@ -2940,15 +2995,15 @@ action)</option>
"""
Check if the selection counter is there.
"""
- response = self.client.get('/test_admin/admin/admin_views/subscriber/')
+ response = self.client.get(reverse('admin:admin_views_subscriber_changelist'))
self.assertContains(response, '0 of 2 selected')
def test_popup_actions(self):
""" Actions should not be shown in popups. """
- response = self.client.get('/test_admin/admin/admin_views/subscriber/')
+ response = self.client.get(reverse('admin:admin_views_subscriber_changelist'))
self.assertNotEqual(response.context["action_form"], None)
response = self.client.get(
- '/test_admin/admin/admin_views/subscriber/?%s' % IS_POPUP_VAR)
+ reverse('admin:admin_views_subscriber_changelist') + '?%s' % IS_POPUP_VAR)
self.assertEqual(response.context["action_form"], None)
def test_popup_template_response(self):
@@ -2957,7 +3012,7 @@ action)</option>
easy customization.
"""
response = self.client.post(
- '/test_admin/admin/admin_views/actor/add/?%s=1' % IS_POPUP_VAR,
+ reverse('admin:admin_views_actor_add') + '?%s=1' % IS_POPUP_VAR,
{'name': 'Troy McClure', 'age': '55', IS_POPUP_VAR: '1'})
self.assertEqual(response.status_code, 200)
self.assertEqual(response.template_name, 'admin/popup_response.html')
@@ -2967,7 +3022,6 @@ action)</option>
ROOT_URLCONF="admin_views.urls")
class TestCustomChangeList(TestCase):
fixtures = ['admin-views-users.xml']
- urlbit = 'admin'
def setUp(self):
result = self.client.login(username='super', password='secret')
@@ -2979,12 +3033,12 @@ class TestCustomChangeList(TestCase):
"""
# Insert some data
post_data = {"name": "First Gadget"}
- response = self.client.post('/test_admin/%s/admin_views/gadget/add/' % self.urlbit, post_data)
+ response = self.client.post(reverse('admin:admin_views_gadget_add'), post_data)
self.assertEqual(response.status_code, 302) # redirect somewhere
# Hit the page once to get messages out of the queue message list
- response = self.client.get('/test_admin/%s/admin_views/gadget/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_gadget_changelist'))
# Ensure that data is still not visible on the page
- response = self.client.get('/test_admin/%s/admin_views/gadget/' % self.urlbit)
+ response = self.client.get(reverse('admin:admin_views_gadget_changelist'))
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, 'First Gadget')
@@ -3002,7 +3056,7 @@ class TestInlineNotEditable(TestCase):
"""
InlineModelAdmin broken?
"""
- response = self.client.get('/test_admin/admin/admin_views/parent/add/')
+ response = self.client.get(reverse('admin:admin_views_parent_add'))
self.assertEqual(response.status_code, 200)
@@ -3015,13 +3069,13 @@ class AdminCustomQuerysetTest(TestCase):
self.client.login(username='super', password='secret')
self.pks = [EmptyModel.objects.create().id for i in range(3)]
self.super_login = {
- REDIRECT_FIELD_NAME: '/test_admin/admin/',
+ REDIRECT_FIELD_NAME: reverse('admin:index'),
'username': 'super',
'password': 'secret',
}
def test_changelist_view(self):
- response = self.client.get('/test_admin/admin/admin_views/emptymodel/')
+ response = self.client.get(reverse('admin:admin_views_emptymodel_changelist'))
for i in self.pks:
if i > 1:
self.assertContains(response, 'Primary key = %s' % i)
@@ -3032,33 +3086,34 @@ class AdminCustomQuerysetTest(TestCase):
# create 2 Person objects
Person.objects.create(name='person1', gender=1)
Person.objects.create(name='person2', gender=2)
+ changelist_url = reverse('admin:admin_views_person_changelist')
# 4 queries are expected: 1 for the session, 1 for the user,
# 1 for the count and 1 for the objects on the page
with self.assertNumQueries(4):
- resp = self.client.get('/test_admin/admin/admin_views/person/')
+ resp = self.client.get(changelist_url)
self.assertEqual(resp.context['selection_note'], '0 of 2 selected')
self.assertEqual(resp.context['selection_note_all'], 'All 2 selected')
# here one more count(*) query will run, because filters were applied
with self.assertNumQueries(5):
extra = {'q': 'not_in_name'}
- resp = self.client.get('/test_admin/admin/admin_views/person/', extra)
+ resp = self.client.get(changelist_url, extra)
self.assertEqual(resp.context['selection_note'], '0 of 0 selected')
self.assertEqual(resp.context['selection_note_all'], 'All 0 selected')
with self.assertNumQueries(5):
extra = {'q': 'person'}
- resp = self.client.get('/test_admin/admin/admin_views/person/', extra)
+ resp = self.client.get(changelist_url, extra)
self.assertEqual(resp.context['selection_note'], '0 of 2 selected')
self.assertEqual(resp.context['selection_note_all'], 'All 2 selected')
with self.assertNumQueries(5):
extra = {'gender__exact': '1'}
- resp = self.client.get('/test_admin/admin/admin_views/person/', extra)
+ resp = self.client.get(changelist_url, extra)
self.assertEqual(resp.context['selection_note'], '0 of 1 selected')
self.assertEqual(resp.context['selection_note_all'], '1 selected')
def test_change_view(self):
for i in self.pks:
- response = self.client.get('/test_admin/admin/admin_views/emptymodel/%s/' % i)
+ response = self.client.get(reverse('admin:admin_views_emptymodel_change', args=(i,)))
if i > 1:
self.assertEqual(response.status_code, 200)
else:
@@ -3074,7 +3129,7 @@ class AdminCustomQuerysetTest(TestCase):
"author": "Candidate, Best",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/coverletter/add/',
+ response = self.client.post(reverse('admin:admin_views_coverletter_add'),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(CoverLetter.objects.count(), 1)
@@ -3092,7 +3147,7 @@ class AdminCustomQuerysetTest(TestCase):
"content": "What's this SMS thing?",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/shortmessage/add/',
+ response = self.client.post(reverse('admin:admin_views_shortmessage_add'),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(ShortMessage.objects.count(), 1)
@@ -3113,7 +3168,7 @@ class AdminCustomQuerysetTest(TestCase):
"title": "Urgent telegram",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/telegram/add/',
+ response = self.client.post(reverse('admin:admin_views_telegram_add'),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(Telegram.objects.count(), 1)
@@ -3131,7 +3186,7 @@ class AdminCustomQuerysetTest(TestCase):
"title": "My Modified Paper Title",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/paper/add/',
+ response = self.client.post(reverse('admin:admin_views_paper_add'),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(Paper.objects.count(), 1)
@@ -3148,14 +3203,14 @@ class AdminCustomQuerysetTest(TestCase):
# model has __unicode__ method
cl = CoverLetter.objects.create(author="John Doe")
self.assertEqual(CoverLetter.objects.count(), 1)
- response = self.client.get('/test_admin/admin/admin_views/coverletter/%s/' % cl.pk)
+ response = self.client.get(reverse('admin:admin_views_coverletter_change', args=(cl.pk,)))
self.assertEqual(response.status_code, 200)
# Emulate model instance edit via the admin
post_data = {
"author": "John Doe II",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/coverletter/%s/' % cl.pk,
+ response = self.client.post(reverse('admin:admin_views_coverletter_change', args=(cl.pk,)),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(CoverLetter.objects.count(), 1)
@@ -3170,14 +3225,14 @@ class AdminCustomQuerysetTest(TestCase):
# model has no __unicode__ method
sm = ShortMessage.objects.create(content="This is expensive")
self.assertEqual(ShortMessage.objects.count(), 1)
- response = self.client.get('/test_admin/admin/admin_views/shortmessage/%s/' % sm.pk)
+ response = self.client.get(reverse('admin:admin_views_shortmessage_change', args=(sm.pk,)))
self.assertEqual(response.status_code, 200)
# Emulate model instance edit via the admin
post_data = {
"content": "Too expensive",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/shortmessage/%s/' % sm.pk,
+ response = self.client.post(reverse('admin:admin_views_shortmessage_change', args=(sm.pk,)),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(ShortMessage.objects.count(), 1)
@@ -3195,14 +3250,14 @@ class AdminCustomQuerysetTest(TestCase):
# model has __unicode__ method
t = Telegram.objects.create(title="Frist Telegram")
self.assertEqual(Telegram.objects.count(), 1)
- response = self.client.get('/test_admin/admin/admin_views/telegram/%s/' % t.pk)
+ response = self.client.get(reverse('admin:admin_views_telegram_change', args=(t.pk,)))
self.assertEqual(response.status_code, 200)
# Emulate model instance edit via the admin
post_data = {
"title": "Telegram without typo",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/telegram/%s/' % t.pk,
+ response = self.client.post(reverse('admin:admin_views_telegram_change', args=(t.pk,)),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(Telegram.objects.count(), 1)
@@ -3217,14 +3272,14 @@ class AdminCustomQuerysetTest(TestCase):
# model has no __unicode__ method
p = Paper.objects.create(title="My Paper Title")
self.assertEqual(Paper.objects.count(), 1)
- response = self.client.get('/test_admin/admin/admin_views/paper/%s/' % p.pk)
+ response = self.client.get(reverse('admin:admin_views_paper_change', args=(p.pk,)))
self.assertEqual(response.status_code, 200)
# Emulate model instance edit via the admin
post_data = {
"title": "My Modified Paper Title",
"_save": "Save",
}
- response = self.client.post('/test_admin/admin/admin_views/paper/%s/' % p.pk,
+ response = self.client.post(reverse('admin:admin_views_paper_change', args=(p.pk,)),
post_data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(Paper.objects.count(), 1)
@@ -3244,18 +3299,21 @@ class AdminCustomQuerysetTest(TestCase):
self.client.post(reverse('admin:login'), self.super_login)
FilteredManager.objects.create(pk=1)
FilteredManager.objects.create(pk=2)
- response = self.client.get('/test_admin/admin/admin_views/filteredmanager/')
+ response = self.client.get(reverse('admin:admin_views_filteredmanager_changelist'))
self.assertContains(response, "PK=1")
self.assertContains(response, "PK=2")
- self.assertEqual(self.client.get('/test_admin/admin/admin_views/filteredmanager/1/history/').status_code, 200)
- self.assertEqual(self.client.get('/test_admin/admin/admin_views/filteredmanager/2/history/').status_code, 200)
+ self.assertEqual(
+ self.client.get(reverse('admin:admin_views_filteredmanager_history', args=(1,))).status_code, 200
+ )
+ self.assertEqual(
+ self.client.get(reverse('admin:admin_views_filteredmanager_history', args=(2,))).status_code, 200
+ )
@override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
ROOT_URLCONF="admin_views.urls")
class AdminInlineFileUploadTest(TestCase):
fixtures = ['admin-views-users.xml', 'admin-views-actions.xml']
- urlbit = 'admin'
def setUp(self):
self.client.login(username='super', password='secret')
@@ -3291,7 +3349,9 @@ class AdminInlineFileUploadTest(TestCase):
"pictures-1-name": "Test Picture 2",
"pictures-1-image": "",
}
- response = self.client.post('/test_admin/%s/admin_views/gallery/%d/' % (self.urlbit, self.gallery.id), post_data)
+ response = self.client.post(
+ reverse('admin:admin_views_gallery_change', args=(self.gallery.id,)), post_data
+ )
self.assertContains(response, b"Currently")
@@ -3395,7 +3455,7 @@ class AdminInlineTests(TestCase):
"A simple model can be saved as inlines"
# First add a new inline
self.post_data['widget_set-0-name'] = "Widget 1"
- collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk
+ collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,))
response = self.client.post(collector_url, self.post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Widget.objects.count(), 1)
@@ -3428,7 +3488,7 @@ class AdminInlineTests(TestCase):
"A model with an explicit autofield primary key can be saved as inlines. Regression for #8093"
# First add a new inline
self.post_data['grommet_set-0-name'] = "Grommet 1"
- collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk
+ collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,))
response = self.client.post(collector_url, self.post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Grommet.objects.count(), 1)
@@ -3461,7 +3521,7 @@ class AdminInlineTests(TestCase):
# First add a new inline
self.post_data['doohickey_set-0-code'] = "DH1"
self.post_data['doohickey_set-0-name'] = "Doohickey 1"
- collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk
+ collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,))
response = self.client.post(collector_url, self.post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(DooHickey.objects.count(), 1)
@@ -3494,20 +3554,21 @@ class AdminInlineTests(TestCase):
# First add a new inline
self.post_data['whatsit_set-0-index'] = "42"
self.post_data['whatsit_set-0-name'] = "Whatsit 1"
- response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data)
+ collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,))
+ response = self.client.post(collector_url, self.post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Whatsit.objects.count(), 1)
self.assertEqual(Whatsit.objects.all()[0].name, "Whatsit 1")
# Check that the PK link exists on the rendered form
- response = self.client.get('/test_admin/admin/admin_views/collector/1/')
+ response = self.client.get(collector_url)
self.assertContains(response, 'name="whatsit_set-0-index"')
# Now resave that inline
self.post_data['whatsit_set-INITIAL_FORMS'] = "1"
self.post_data['whatsit_set-0-index'] = "42"
self.post_data['whatsit_set-0-name'] = "Whatsit 1"
- response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data)
+ response = self.client.post(collector_url, self.post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Whatsit.objects.count(), 1)
self.assertEqual(Whatsit.objects.all()[0].name, "Whatsit 1")
@@ -3516,7 +3577,7 @@ class AdminInlineTests(TestCase):
self.post_data['whatsit_set-INITIAL_FORMS'] = "1"
self.post_data['whatsit_set-0-index'] = "42"
self.post_data['whatsit_set-0-name'] = "Whatsit 1 Updated"
- response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data)
+ response = self.client.post(collector_url, self.post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Whatsit.objects.count(), 1)
self.assertEqual(Whatsit.objects.all()[0].name, "Whatsit 1 Updated")
@@ -3525,7 +3586,7 @@ class AdminInlineTests(TestCase):
"An inherited model can be saved as inlines. Regression for #11042"
# First add a new inline
self.post_data['fancydoodad_set-0-name'] = "Fancy Doodad 1"
- collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk
+ collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,))
response = self.client.post(collector_url, self.post_data)
self.assertEqual(response.status_code, 302)
self.assertEqual(FancyDoodad.objects.count(), 1)
@@ -3599,7 +3660,8 @@ class AdminInlineTests(TestCase):
"category_set-6-id": "",
"category_set-6-collector": "1",
})
- response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data)
+ collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,))
+ response = self.client.post(collector_url, self.post_data)
# Successful post will redirect
self.assertEqual(response.status_code, 302)
@@ -3621,64 +3683,64 @@ class NeverCacheTests(TestCase):
def test_admin_index(self):
"Check the never-cache status of the main index"
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
self.assertEqual(get_max_age(response), 0)
def test_app_index(self):
"Check the never-cache status of an application index"
- response = self.client.get('/test_admin/admin/admin_views/')
+ response = self.client.get(reverse('admin:app_list', args=('admin_views',)))
self.assertEqual(get_max_age(response), 0)
def test_model_index(self):
"Check the never-cache status of a model index"
- response = self.client.get('/test_admin/admin/admin_views/fabric/')
+ response = self.client.get(reverse('admin:admin_views_fabric_changelist'))
self.assertEqual(get_max_age(response), 0)
def test_model_add(self):
"Check the never-cache status of a model add page"
- response = self.client.get('/test_admin/admin/admin_views/fabric/add/')
+ response = self.client.get(reverse('admin:admin_views_fabric_add'))
self.assertEqual(get_max_age(response), 0)
def test_model_view(self):
"Check the never-cache status of a model edit page"
- response = self.client.get('/test_admin/admin/admin_views/section/1/')
+ response = self.client.get(reverse('admin:admin_views_section_change', args=(1,)))
self.assertEqual(get_max_age(response), 0)
def test_model_history(self):
"Check the never-cache status of a model history page"
- response = self.client.get('/test_admin/admin/admin_views/section/1/history/')
+ response = self.client.get(reverse('admin:admin_views_section_history', args=(1,)))
self.assertEqual(get_max_age(response), 0)
def test_model_delete(self):
"Check the never-cache status of a model delete page"
- response = self.client.get('/test_admin/admin/admin_views/section/1/delete/')
+ response = self.client.get(reverse('admin:admin_views_section_delete', args=(1,)))
self.assertEqual(get_max_age(response), 0)
def test_login(self):
"Check the never-cache status of login views"
self.client.logout()
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
self.assertEqual(get_max_age(response), 0)
def test_logout(self):
"Check the never-cache status of logout view"
- response = self.client.get('/test_admin/admin/logout/')
+ response = self.client.get(reverse('admin:logout'))
self.assertEqual(get_max_age(response), 0)
def test_password_change(self):
"Check the never-cache status of the password change view"
self.client.logout()
- response = self.client.get('/test_admin/password_change/')
+ response = self.client.get(reverse('admin:password_change'))
self.assertEqual(get_max_age(response), None)
def test_password_change_done(self):
"Check the never-cache status of the password change done view"
- response = self.client.get('/test_admin/admin/password_change/done/')
+ response = self.client.get(reverse('admin:password_change_done'))
self.assertEqual(get_max_age(response), None)
def test_JS_i18n(self):
"Check the never-cache status of the JavaScript i18n view"
- response = self.client.get('/test_admin/admin/jsi18n/')
+ response = self.client.get(reverse('admin:jsi18n'))
self.assertEqual(get_max_age(response), None)
@@ -3691,14 +3753,14 @@ class PrePopulatedTest(TestCase):
self.client.login(username='super', password='secret')
def test_prepopulated_on(self):
- response = self.client.get('/test_admin/admin/admin_views/prepopulatedpost/add/')
+ response = self.client.get(reverse('admin:admin_views_prepopulatedpost_add'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "id: '#id_slug',")
self.assertContains(response, "field['dependency_ids'].push('#id_title');")
self.assertContains(response, "id: '#id_prepopulatedsubpost_set-0-subslug',")
def test_prepopulated_off(self):
- response = self.client.get('/test_admin/admin/admin_views/prepopulatedpost/1/')
+ response = self.client.get(reverse('admin:admin_views_prepopulatedpost_change', args=(1,)))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "A Long Title")
self.assertNotContains(response, "id: '#id_slug'")
@@ -3711,7 +3773,7 @@ class PrePopulatedTest(TestCase):
Regression test for #15938: if USE_THOUSAND_SEPARATOR is set, make sure
that maxLength (in the JavaScript) is rendered without separators.
"""
- response = self.client.get('/test_admin/admin/admin_views/prepopulatedpostlargeslug/add/')
+ response = self.client.get(reverse('admin:admin_views_prepopulatedpostlargeslug_add'))
self.assertContains(response, "maxLength: 1000") # instead of 1,000
@@ -3729,9 +3791,9 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
main form and with stacked and tabular inlines.
Refs #13068, #9264, #9983, #9784.
"""
- self.admin_login(username='super', password='secret', login_url='/test_admin/admin/')
+ self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
self.selenium.get('%s%s' % (self.live_server_url,
- '/test_admin/admin/admin_views/mainprepopulated/add/'))
+ reverse('admin:admin_views_mainprepopulated_add')))
# Main form ----------------------------------------------------------
self.selenium.find_element_by_css_selector('#id_pubdate').send_keys('2012-02-18')
@@ -3839,11 +3901,11 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
)
self.admin_login(username='super',
password='secret',
- login_url='/test_admin/admin/')
+ login_url=reverse('admin:index'))
object_url = '%s%s' % (
self.live_server_url,
- '/test_admin/admin/admin_views/mainprepopulated/{}/'.format(item.id))
+ reverse('admin:admin_views_mainprepopulated_change', args=(item.id,)))
self.selenium.get(object_url)
self.selenium.find_element_by_css_selector('#id_name').send_keys(' the best')
@@ -3872,9 +3934,9 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
Test that the 'collapse' class in fieldsets definition allows to
show/hide the appropriate field section.
"""
- self.admin_login(username='super', password='secret', login_url='/test_admin/admin/')
+ self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
self.selenium.get('%s%s' % (self.live_server_url,
- '/test_admin/admin/admin_views/article/add/'))
+ reverse('admin:admin_views_article_add')))
self.assertFalse(self.selenium.find_element_by_id('id_title').is_displayed())
self.selenium.find_elements_by_link_text('Show')[0].click()
self.assertTrue(self.selenium.find_element_by_id('id_title').is_displayed())
@@ -3886,9 +3948,9 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_first_field_focus(self):
"""JavaScript-assisted auto-focus on first usable form field."""
# First form field has a single widget
- self.admin_login(username='super', password='secret', login_url='/test_admin/admin/')
+ self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
self.selenium.get('%s%s' % (self.live_server_url,
- '/test_admin/admin/admin_views/picture/add/'))
+ reverse('admin:admin_views_picture_add')))
self.assertEqual(
self.selenium.switch_to.active_element,
self.selenium.find_element_by_id('id_name')
@@ -3896,7 +3958,7 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
# First form field has a MultiWidget
self.selenium.get('%s%s' % (self.live_server_url,
- '/test_admin/admin/admin_views/reservation/add/'))
+ reverse('admin:admin_views_reservation_add')))
self.assertEqual(
self.selenium.switch_to.active_element,
self.selenium.find_element_by_id('id_start_date_0')
@@ -3907,7 +3969,7 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
pizza = Pizza.objects.create(name="Double Cheese")
url = reverse('admin:admin_views_pizza_change', args=(pizza.id,))
full_url = '%s%s' % (self.live_server_url, url)
- self.admin_login(username='super', password='secret', login_url='/test_admin/admin/')
+ self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
self.selenium.get(full_url)
self.selenium.find_element_by_class_name('deletelink').click()
self.selenium.find_element_by_class_name('cancel-link').click()
@@ -3926,7 +3988,7 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
pizza.toppings.add(topping1, topping2)
url = reverse('admin:admin_views_pizza_change', args=(pizza.id,))
full_url = '%s%s' % (self.live_server_url, url)
- self.admin_login(username='super', password='secret', login_url='/test_admin/admin/')
+ self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
self.selenium.get(full_url)
self.selenium.find_element_by_class_name('deletelink').click()
self.selenium.find_element_by_class_name('cancel-link').click()
@@ -3953,7 +4015,7 @@ class ReadonlyTest(TestCase):
self.client.login(username='super', password='secret')
def test_readonly_get(self):
- response = self.client.get('/test_admin/admin/admin_views/post/add/')
+ response = self.client.get(reverse('admin:admin_views_post_add'))
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, 'name="posted"')
# 3 fields + 2 submit buttons + 5 inline management form fields, + 2
@@ -3985,7 +4047,7 @@ class ReadonlyTest(TestCase):
self.assertContains(response, '<p class="help">Some help text for the date (with unicode ŠĐĆŽćžšđ)</p>', html=True)
p = Post.objects.create(title="I worked on readonly_fields", content="Its good stuff")
- response = self.client.get('/test_admin/admin/admin_views/post/%d/' % p.pk)
+ response = self.client.get(reverse('admin:admin_views_post_change', args=(p.pk,)))
self.assertContains(response, "%d amount of cool" % p.pk)
def test_readonly_post(self):
@@ -3996,14 +4058,14 @@ class ReadonlyTest(TestCase):
"link_set-INITIAL_FORMS": "0",
"link_set-MAX_NUM_FORMS": "0",
}
- response = self.client.post('/test_admin/admin/admin_views/post/add/', data)
+ response = self.client.post(reverse('admin:admin_views_post_add'), data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Post.objects.count(), 1)
p = Post.objects.get()
self.assertEqual(p.posted, datetime.date.today())
data["posted"] = "10-8-1990" # some date that's not today
- response = self.client.post('/test_admin/admin/admin_views/post/add/', data)
+ response = self.client.post(reverse('admin:admin_views_post_add'), data)
self.assertEqual(response.status_code, 302)
self.assertEqual(Post.objects.count(), 2)
p = Post.objects.order_by('-id')[0]
@@ -4011,12 +4073,12 @@ class ReadonlyTest(TestCase):
def test_readonly_manytomany(self):
"Regression test for #13004"
- response = self.client.get('/test_admin/admin/admin_views/pizza/add/')
+ response = self.client.get(reverse('admin:admin_views_pizza_add'))
self.assertEqual(response.status_code, 200)
def test_user_password_change_limited_queryset(self):
su = User.objects.filter(is_superuser=True)[0]
- response = self.client.get('/test_admin/admin2/auth/user/%s/password/' % su.pk)
+ response = self.client.get(reverse('admin2:auth_user_password_change', args=(su.pk,)))
self.assertEqual(response.status_code, 404)
def test_change_form_renders_correct_null_choice_value(self):
@@ -4024,7 +4086,7 @@ class ReadonlyTest(TestCase):
Regression test for #17911.
"""
choice = Choice.objects.create(choice=None)
- response = self.client.get('/test_admin/admin/admin_views/choice/%s/' % choice.pk)
+ response = self.client.get(reverse('admin:admin_views_choice_change', args=(choice.pk,)))
self.assertContains(response, '<p>No opinion</p>', html=True)
self.assertNotContains(response, '<p>(None)</p>')
@@ -4036,7 +4098,7 @@ class ReadonlyTest(TestCase):
topping = Topping.objects.create(name='Salami')
pizza = Pizza.objects.create(name='Americano')
pizza.toppings.add(topping)
- response = self.client.get('/test_admin/admin/admin_views/topping/add/')
+ response = self.client.get(reverse('admin:admin_views_topping_add'))
self.assertEqual(response.status_code, 200)
def test_readonly_field_overrides(self):
@@ -4045,7 +4107,7 @@ class ReadonlyTest(TestCase):
AdminReadonlyField
"""
p = FieldOverridePost.objects.create(title="Test Post", content="Test Content")
- response = self.client.get('/test_admin/admin/admin_views/fieldoverridepost/%d/' % p.pk)
+ response = self.client.get(reverse('admin:admin_views_fieldoverridepost_change', args=(p.pk,)))
self.assertEqual(response.status_code, 200)
self.assertContains(response, '<p class="help">Overridden help text for the date</p>')
self.assertContains(response, '<label for="id_public">Overridden public label:</label>', html=True)
@@ -4070,7 +4132,7 @@ class LimitChoicesToInAdminTest(TestCase):
username='marley',
last_action=datetime.datetime.today() - datetime.timedelta(days=1),
)
- response = self.client.get('/test_admin/admin/admin_views/stumpjoke/add/')
+ response = self.client.get(reverse('admin:admin_views_stumpjoke_add'))
# The allowed option should appear twice; the limited option should not appear.
self.assertContains(response, threepwood.username, count=2)
self.assertNotContains(response, marley.username)
@@ -4093,7 +4155,7 @@ class RawIdFieldsTest(TestCase):
Inquisition.objects.create(expected=False,
leader=actor,
country="Spain")
- response = self.client.get('/test_admin/admin/admin_views/sketch/add/')
+ response = self.client.get(reverse('admin:admin_views_sketch_add'))
# Find the link
m = re.search(br'<a href="([^"]*)"[^>]* id="lookup_id_inquisition"', response.content)
self.assertTrue(m) # Got a match
@@ -4116,7 +4178,7 @@ class RawIdFieldsTest(TestCase):
"""Regression test for 20182"""
Actor.objects.create(name="Palin", age=27)
Actor.objects.create(name="Kilbraken", age=50, title="Judge")
- response = self.client.get('/test_admin/admin/admin_views/sketch/add/')
+ response = self.client.get(reverse('admin:admin_views_sketch_add'))
# Find the link
m = re.search(br'<a href="([^"]*)"[^>]* id="lookup_id_defendant0"', response.content)
self.assertTrue(m) # Got a match
@@ -4136,7 +4198,7 @@ class RawIdFieldsTest(TestCase):
"""Regression test for 20182"""
Actor.objects.create(name="Palin", age=27)
Actor.objects.create(name="Kilbraken", age=50, title="Judge")
- response = self.client.get('/test_admin/admin/admin_views/sketch/add/')
+ response = self.client.get(reverse('admin:admin_views_sketch_add'))
# Find the link
m = re.search(br'<a href="([^"]*)"[^>]* id="lookup_id_defendant1"', response.content)
self.assertTrue(m) # Got a match
@@ -4166,31 +4228,31 @@ class UserAdminTest(TestCase):
def test_save_button(self):
user_count = User.objects.count()
- response = self.client.post('/test_admin/admin/auth/user/add/', {
+ response = self.client.post(reverse('admin:auth_user_add'), {
'username': 'newuser',
'password1': 'newpassword',
'password2': 'newpassword',
})
new_user = User.objects.order_by('-id')[0]
- self.assertRedirects(response, '/test_admin/admin/auth/user/%s/' % new_user.pk)
+ self.assertRedirects(response, reverse('admin:auth_user_change', args=(new_user.pk,)))
self.assertEqual(User.objects.count(), user_count + 1)
self.assertTrue(new_user.has_usable_password())
def test_save_continue_editing_button(self):
user_count = User.objects.count()
- response = self.client.post('/test_admin/admin/auth/user/add/', {
+ response = self.client.post(reverse('admin:auth_user_add'), {
'username': 'newuser',
'password1': 'newpassword',
'password2': 'newpassword',
'_continue': '1',
})
new_user = User.objects.order_by('-id')[0]
- self.assertRedirects(response, '/test_admin/admin/auth/user/%s/' % new_user.pk)
+ self.assertRedirects(response, reverse('admin:auth_user_change', args=(new_user.pk,)))
self.assertEqual(User.objects.count(), user_count + 1)
self.assertTrue(new_user.has_usable_password())
def test_password_mismatch(self):
- response = self.client.post('/test_admin/admin/auth/user/add/', {
+ response = self.client.post(reverse('admin:auth_user_add'), {
'username': 'newuser',
'password1': 'newpassword',
'password2': 'mismatch',
@@ -4203,11 +4265,11 @@ class UserAdminTest(TestCase):
def test_user_fk_add_popup(self):
"""User addition through a FK popup should return the appropriate JavaScript response."""
- response = self.client.get('/test_admin/admin/admin_views/album/add/')
+ response = self.client.get(reverse('admin:admin_views_album_add'))
self.assertEqual(response.status_code, 200)
- self.assertContains(response, '/test_admin/admin/auth/user/add')
+ self.assertContains(response, reverse('admin:auth_user_add'))
self.assertContains(response, 'class="related-widget-wrapper-link add-related" id="add_id_owner"')
- response = self.client.get('/test_admin/admin/auth/user/add/?_popup=1')
+ response = self.client.get(reverse('admin:auth_user_add') + '?_popup=1')
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, 'name="_continue"')
self.assertNotContains(response, 'name="_addanother"')
@@ -4218,18 +4280,18 @@ class UserAdminTest(TestCase):
'_popup': '1',
'_save': '1',
}
- response = self.client.post('/test_admin/admin/auth/user/add/?_popup=1', data, follow=True)
+ response = self.client.post(reverse('admin:auth_user_add') + '?_popup=1', data, follow=True)
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'dismissAddRelatedObjectPopup')
def test_user_fk_change_popup(self):
"""User change through a FK popup should return the appropriate JavaScript response."""
- response = self.client.get('/test_admin/admin/admin_views/album/add/')
+ response = self.client.get(reverse('admin:admin_views_album_add'))
self.assertEqual(response.status_code, 200)
- self.assertContains(response, '/test_admin/admin/auth/user/__fk__/')
+ self.assertContains(response, reverse('admin:auth_user_change', args=('__fk__',)))
self.assertContains(response, 'class="related-widget-wrapper-link change-related" id="change_id_owner"')
user = User.objects.get(username='changeuser')
- url = "/test_admin/admin/auth/user/%s/?_popup=1" % user.pk
+ url = reverse('admin:auth_user_change', args=(user.pk,)) + '?_popup=1'
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, 'name="_continue"')
@@ -4251,12 +4313,12 @@ class UserAdminTest(TestCase):
def test_user_fk_delete_popup(self):
"""User deletion through a FK popup should return the appropriate JavaScript response."""
- response = self.client.get('/test_admin/admin/admin_views/album/add/')
+ response = self.client.get(reverse('admin:admin_views_album_add'))
self.assertEqual(response.status_code, 200)
- self.assertContains(response, '/test_admin/admin/auth/user/__fk__/delete/')
+ self.assertContains(response, reverse('admin:auth_user_delete', args=('__fk__',)))
self.assertContains(response, 'class="related-widget-wrapper-link change-related" id="change_id_owner"')
user = User.objects.get(username='changeuser')
- url = "/test_admin/admin/auth/user/%s/delete/?_popup=1" % user.pk
+ url = reverse('admin:auth_user_delete', args=(user.pk,)) + '?_popup=1'
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
data = {
@@ -4269,14 +4331,14 @@ class UserAdminTest(TestCase):
def test_save_add_another_button(self):
user_count = User.objects.count()
- response = self.client.post('/test_admin/admin/auth/user/add/', {
+ response = self.client.post(reverse('admin:auth_user_add'), {
'username': 'newuser',
'password1': 'newpassword',
'password2': 'newpassword',
'_addanother': '1',
})
new_user = User.objects.order_by('-id')[0]
- self.assertRedirects(response, '/test_admin/admin/auth/user/add/')
+ self.assertRedirects(response, reverse('admin:auth_user_add'))
self.assertEqual(User.objects.count(), user_count + 1)
self.assertTrue(new_user.has_usable_password())
@@ -4287,12 +4349,12 @@ class UserAdminTest(TestCase):
ContentType.objects.clear_cache()
with self.assertNumQueries(10):
- response = self.client.get('/test_admin/admin/auth/user/%s/' % u.pk)
+ response = self.client.get(reverse('admin:auth_user_change', args=(u.pk,)))
self.assertEqual(response.status_code, 200)
def test_form_url_present_in_context(self):
u = User.objects.all()[0]
- response = self.client.get('/test_admin/admin3/auth/user/%s/password/' % u.pk)
+ response = self.client.get(reverse('admin3:auth_user_password_change', args=(u.pk,)))
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['form_url'], 'pony')
@@ -4310,12 +4372,12 @@ class GroupAdminTest(TestCase):
def test_save_button(self):
group_count = Group.objects.count()
- response = self.client.post('/test_admin/admin/auth/group/add/', {
+ response = self.client.post(reverse('admin:auth_group_add'), {
'name': 'newgroup',
})
Group.objects.order_by('-id')[0]
- self.assertRedirects(response, '/test_admin/admin/auth/group/')
+ self.assertRedirects(response, reverse('admin:auth_group_changelist'))
self.assertEqual(Group.objects.count(), group_count + 1)
def test_group_permission_performance(self):
@@ -4325,7 +4387,7 @@ class GroupAdminTest(TestCase):
ContentType.objects.clear_cache()
with self.assertNumQueries(8):
- response = self.client.get('/test_admin/admin/auth/group/%s/' % g.pk)
+ response = self.client.get(reverse('admin:auth_group_change', args=(g.pk,)))
self.assertEqual(response.status_code, 200)
@@ -4342,7 +4404,7 @@ class CSSTest(TestCase):
Ensure that fields have a CSS class name with a 'field-' prefix.
Refs #16371.
"""
- response = self.client.get('/test_admin/admin/admin_views/post/add/')
+ response = self.client.get(reverse('admin:admin_views_post_add'))
# The main form
self.assertContains(response, 'class="form-row field-title"')
@@ -4364,13 +4426,13 @@ class CSSTest(TestCase):
Refs #17050.
"""
# General index page
- response = self.client.get("/test_admin/admin/")
+ response = self.client.get(reverse('admin:index'))
self.assertContains(response, '<div class="app-admin_views module">')
self.assertContains(response, '<tr class="model-actor">')
self.assertContains(response, '<tr class="model-album">')
# App index page
- response = self.client.get("/test_admin/admin/admin_views/")
+ response = self.client.get(reverse('admin:app_list', args=('admin_views',)))
self.assertContains(response, '<div class="app-admin_views module">')
self.assertContains(response, '<tr class="model-actor">')
self.assertContains(response, '<tr class="model-album">')
@@ -4379,7 +4441,7 @@ class CSSTest(TestCase):
"""
Ensure app and model tag are correctly read by change_form template
"""
- response = self.client.get('/test_admin/admin/admin_views/section/add/')
+ response = self.client.get(reverse('admin:admin_views_section_add'))
self.assertEqual(response.status_code, 200)
self.assertContains(response,
'<body class=" app-admin_views model-section ')
@@ -4388,7 +4450,7 @@ class CSSTest(TestCase):
"""
Ensure app and model tag are correctly read by change_list template
"""
- response = self.client.get('/test_admin/admin/admin_views/section/')
+ response = self.client.get(reverse('admin:admin_views_section_changelist'))
self.assertEqual(response.status_code, 200)
self.assertContains(response,
'<body class=" app-admin_views model-section ')
@@ -4399,7 +4461,7 @@ class CSSTest(TestCase):
template
"""
response = self.client.get(
- '/test_admin/admin/admin_views/section/1/delete/')
+ reverse('admin:admin_views_section_delete', args=(1,)))
self.assertEqual(response.status_code, 200)
self.assertContains(response,
'<body class=" app-admin_views model-section ')
@@ -4408,7 +4470,7 @@ class CSSTest(TestCase):
"""
Ensure app and model tag are correctly read by app_index template
"""
- response = self.client.get('/test_admin/admin/admin_views/')
+ response = self.client.get(reverse('admin:app_list', args=('admin_views',)))
self.assertEqual(response.status_code, 200)
self.assertContains(response, '<body class=" dashboard app-admin_views')
@@ -4422,7 +4484,7 @@ class CSSTest(TestCase):
'action': 'delete_selected',
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/section/',
+ response = self.client.post(reverse('admin:admin_views_section_changelist'),
action_data)
self.assertEqual(response.status_code, 200)
self.assertContains(response,
@@ -4435,7 +4497,7 @@ class CSSTest(TestCase):
"""
Podcast.objects.create(name="Django Dose",
release_date=datetime.date.today())
- response = self.client.get('/test_admin/admin/admin_views/podcast/')
+ response = self.client.get(reverse('admin:admin_views_podcast_changelist'))
self.assertContains(
response, '<th class="field-name">')
self.assertContains(
@@ -4461,7 +4523,7 @@ class AdminDocsTest(TestCase):
self.client.login(username='super', password='secret')
def test_tags(self):
- response = self.client.get('/test_admin/admin/doc/tags/')
+ response = self.client.get(reverse('django-admindocs-tags'))
# The builtin tag group exists
self.assertContains(response, "<h2>Built-in tags</h2>", count=2, html=True)
@@ -4482,7 +4544,7 @@ class AdminDocsTest(TestCase):
self.assertContains(response, '<li><a href="#admin_list-admin_actions">admin_actions</a></li>', html=True)
def test_filters(self):
- response = self.client.get('/test_admin/admin/doc/filters/')
+ response = self.client.get(reverse('django-admindocs-filters'))
# The builtin filter group exists
self.assertContains(response, "<h2>Built-in filters</h2>", count=2, html=True)
@@ -4511,13 +4573,12 @@ class AdminDocsTest(TestCase):
)
class ValidXHTMLTests(TestCase):
fixtures = ['admin-views-users.xml']
- urlbit = 'admin'
def setUp(self):
self.client.login(username='super', password='secret')
def test_lang_name_present(self):
- response = self.client.get('/test_admin/%s/admin_views/' % self.urlbit)
+ response = self.client.get(reverse('admin:app_list', args=('admin_views',)))
self.assertNotContains(response, ' lang=""')
self.assertNotContains(response, ' xml:lang=""')
@@ -4665,7 +4726,7 @@ class AdminCustomSaveRelatedTests(TestCase):
'child_set-0-name': 'Paul',
'child_set-1-name': 'Catherine',
}
- self.client.post('/test_admin/admin/admin_views/parent/add/', post)
+ self.client.post(reverse('admin:admin_views_parent_add'), post)
self.assertEqual(1, Parent.objects.count())
self.assertEqual(2, Child.objects.count())
@@ -4687,7 +4748,7 @@ class AdminCustomSaveRelatedTests(TestCase):
'child_set-1-name': 'Catherine',
'child_set-1-id': catherine.id,
}
- self.client.post('/test_admin/admin/admin_views/parent/%s/' % parent.id, post)
+ self.client.post(reverse('admin:admin_views_parent_change', args=(parent.id,)), post)
children_names = list(Child.objects.order_by('name').values_list('name', flat=True))
@@ -4707,7 +4768,7 @@ class AdminCustomSaveRelatedTests(TestCase):
'_save': 'Save'
}
- self.client.post('/test_admin/admin/admin_views/parent/', post)
+ self.client.post(reverse('admin:admin_views_parent_changelist'), post)
children_names = list(Child.objects.order_by('name').values_list('name', flat=True))
self.assertEqual('Josh Stone', Parent.objects.latest('id').name)
@@ -4723,21 +4784,21 @@ class AdminViewLogoutTest(TestCase):
self.client.login(username='super', password='secret')
def test_client_logout_url_can_be_used_to_login(self):
- response = self.client.get('/test_admin/admin/logout/')
+ response = self.client.get(reverse('admin:logout'))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'registration/logged_out.html')
- self.assertEqual(response.request['PATH_INFO'], '/test_admin/admin/logout/')
+ self.assertEqual(response.request['PATH_INFO'], reverse('admin:logout'))
# we are now logged out
- response = self.client.get('/test_admin/admin/logout/')
+ response = self.client.get(reverse('admin:logout'))
self.assertEqual(response.status_code, 302) # we should be redirected to the login page.
# follow the redirect and test results.
- response = self.client.get('/test_admin/admin/logout/', follow=True)
+ response = self.client.get(reverse('admin:logout'), follow=True)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'admin/login.html')
- self.assertEqual(response.request['PATH_INFO'], '/test_admin/admin/login/')
- self.assertContains(response, '<input type="hidden" name="next" value="/test_admin/admin/" />')
+ self.assertEqual(response.request['PATH_INFO'], reverse('admin:login'))
+ self.assertContains(response, '<input type="hidden" name="next" value="%s" />' % reverse('admin:index'))
@override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
@@ -4759,7 +4820,7 @@ class AdminUserMessageTest(TestCase):
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/usermessenger/',
+ response = self.client.post(reverse('admin:admin_views_usermessenger_changelist'),
action_data, follow=True)
self.assertContains(response,
'<li class="%s">Test %s</li>' % (level, level),
@@ -4788,7 +4849,7 @@ class AdminUserMessageTest(TestCase):
'index': 0,
}
- response = self.client.post('/test_admin/admin/admin_views/usermessenger/',
+ response = self.client.post(reverse('admin:admin_views_usermessenger_changelist'),
action_data, follow=True)
self.assertContains(response,
'<li class="extra_tag info">Test tags</li>',
@@ -4828,34 +4889,35 @@ class AdminKeepChangeListFiltersTests(TestCase):
def test_assert_url_equal(self):
# Test equality.
+ change_user_url = reverse('admin:auth_user_change', args=(105,))
self.assertURLEqual(
- 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0',
- 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'
+ 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url),
+ 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url)
)
# Test inequality.
with self.assertRaises(AssertionError):
self.assertURLEqual(
- 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0',
- 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D1%26is_superuser__exact%3D1'
+ 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url),
+ 'http://testserver{}?_changelist_filters=is_staff__exact%3D1%26is_superuser__exact%3D1'.format(change_user_url)
)
# Ignore scheme and host.
self.assertURLEqual(
- 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0',
- '/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'
+ 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url),
+ '{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url)
)
# Ignore ordering of querystring.
self.assertURLEqual(
- '/test_admin/admin/auth/user/?is_staff__exact=0&is_superuser__exact=0',
- '/test_admin/admin/auth/user/?is_superuser__exact=0&is_staff__exact=0'
+ '{}?is_staff__exact=0&is_superuser__exact=0'.format(reverse('admin:auth_user_changelist')),
+ '{}?is_superuser__exact=0&is_staff__exact=0'.format(reverse('admin:auth_user_changelist'))
)
# Ignore ordering of _changelist_filters.
self.assertURLEqual(
- '/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0',
- '/test_admin/admin/auth/user/105/?_changelist_filters=is_superuser__exact%3D0%26is_staff__exact%3D0'
+ '{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url),
+ '{}?_changelist_filters=is_superuser__exact%3D0%26is_staff__exact%3D0'.format(change_user_url)
)
def get_changelist_filters(self):
@@ -5089,19 +5151,19 @@ class TestLabelVisibility(TestCase):
self.client.login(username='super', password='secret')
def test_all_fields_visible(self):
- response = self.client.get('/test_admin/admin/admin_views/emptymodelvisible/add/')
+ response = self.client.get(reverse('admin:admin_views_emptymodelvisible_add'))
self.assert_fieldline_visible(response)
self.assert_field_visible(response, 'first')
self.assert_field_visible(response, 'second')
def test_all_fields_hidden(self):
- response = self.client.get('/test_admin/admin/admin_views/emptymodelhidden/add/')
+ response = self.client.get(reverse('admin:admin_views_emptymodelhidden_add'))
self.assert_fieldline_hidden(response)
self.assert_field_hidden(response, 'first')
self.assert_field_hidden(response, 'second')
def test_mixin(self):
- response = self.client.get('/test_admin/admin/admin_views/emptymodelmixin/add/')
+ response = self.client.get(reverse('admin:admin_views_emptymodelmixin_add'))
self.assert_fieldline_visible(response)
self.assert_field_hidden(response, 'first')
self.assert_field_visible(response, 'second')
@@ -5143,7 +5205,7 @@ class AdminViewOnSiteTests(TestCase):
"dependentchild_set-0-id": "",
"dependentchild_set-0-parent": "",
"dependentchild_set-0-family_name": "Test2"}
- response = self.client.post('/test_admin/admin/admin_views/parentwithdependentchildren/add/',
+ response = self.client.post(reverse('admin:admin_views_parentwithdependentchildren_add'),
post_data)
# just verifying the parent form failed validation, as expected --
@@ -5173,8 +5235,9 @@ class AdminViewOnSiteTests(TestCase):
"dependentchild_set-0-id": "",
"dependentchild_set-0-parent": str(pwdc.id),
"dependentchild_set-0-family_name": "Test1"}
- response = self.client.post('/test_admin/admin/admin_views/parentwithdependentchildren/%d/'
- % pwdc.id, post_data)
+ response = self.client.post(
+ reverse('admin:admin_views_parentwithdependentchildren_change', args=(pwdc.id,)), post_data
+ )
# just verifying the parent form failed validation, as expected --
# this isn't the regression test
@@ -5209,27 +5272,21 @@ class AdminViewOnSiteTests(TestCase):
def test_false(self):
"Ensure that the 'View on site' button is not displayed if view_on_site is False"
- response = self.client.get('/test_admin/admin/admin_views/restaurant/1/')
+ response = self.client.get(reverse('admin:admin_views_restaurant_change', args=(1,)))
content_type_pk = ContentType.objects.get_for_model(Restaurant).pk
- self.assertNotContains(response,
- '"/test_admin/admin/r/%s/1/"' % content_type_pk,
- )
+ self.assertNotContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1)))
def test_true(self):
"Ensure that the default behavior is followed if view_on_site is True"
- response = self.client.get('/test_admin/admin/admin_views/city/1/')
+ response = self.client.get(reverse('admin:admin_views_city_change', args=(1,)))
content_type_pk = ContentType.objects.get_for_model(City).pk
- self.assertContains(response,
- '"/test_admin/admin/r/%s/1/"' % content_type_pk,
- )
+ self.assertContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1)))
def test_callable(self):
"Ensure that the right link is displayed if view_on_site is a callable"
- response = self.client.get('/test_admin/admin/admin_views/worker/1/')
+ response = self.client.get(reverse('admin:admin_views_worker_change', args=(1,)))
worker = Worker.objects.get(pk=1)
- self.assertContains(response,
- '"/worker/%s/%s/"' % (worker.surname, worker.name),
- )
+ self.assertContains(response, '"/worker/%s/%s/"' % (worker.surname, worker.name))
def test_missing_get_absolute_url(self):
"Ensure None is returned if model doesn't have get_absolute_url"
@@ -5247,27 +5304,21 @@ class InlineAdminViewOnSiteTest(TestCase):
def test_false(self):
"Ensure that the 'View on site' button is not displayed if view_on_site is False"
- response = self.client.get('/test_admin/admin/admin_views/state/1/')
+ response = self.client.get(reverse('admin:admin_views_state_change', args=(1,)))
content_type_pk = ContentType.objects.get_for_model(City).pk
- self.assertNotContains(response,
- '/test_admin/admin/r/%s/1/' % content_type_pk,
- )
+ self.assertNotContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1)))
def test_true(self):
"Ensure that the 'View on site' button is displayed if view_on_site is True"
- response = self.client.get('/test_admin/admin/admin_views/city/1/')
+ response = self.client.get(reverse('admin:admin_views_city_change', args=(1,)))
content_type_pk = ContentType.objects.get_for_model(Restaurant).pk
- self.assertContains(response,
- '/test_admin/admin/r/%s/1/' % content_type_pk,
- )
+ self.assertContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1)))
def test_callable(self):
"Ensure that the right link is displayed if view_on_site is a callable"
- response = self.client.get('/test_admin/admin/admin_views/restaurant/1/')
+ response = self.client.get(reverse('admin:admin_views_restaurant_change', args=(1,)))
worker = Worker.objects.get(pk=1)
- self.assertContains(response,
- '"/worker_inline/%s/%s/"' % (worker.surname, worker.name),
- )
+ self.assertContains(response, '"/worker_inline/%s/%s/"' % (worker.surname, worker.name))
@override_settings(ROOT_URLCONF="admin_views.urls")
@@ -5276,12 +5327,12 @@ class TestEtagWithAdminView(TestCase):
def test_admin(self):
with self.settings(USE_ETAGS=False):
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
self.assertEqual(response.status_code, 302)
self.assertFalse(response.has_header('ETag'))
with self.settings(USE_ETAGS=True):
- response = self.client.get('/test_admin/admin/')
+ response = self.client.get(reverse('admin:index'))
self.assertEqual(response.status_code, 302)
self.assertTrue(response.has_header('ETag'))
@@ -5305,30 +5356,18 @@ class GetFormsetsWithInlinesArgumentTest(TestCase):
def test_explicitly_provided_pk(self):
post_data = {'name': '1'}
- try:
- response = self.client.post('/test_admin/admin/admin_views/explicitlyprovidedpk/add/', post_data)
- except Exception as e:
- self.fail(e)
+ response = self.client.post(reverse('admin:admin_views_explicitlyprovidedpk_add'), post_data)
self.assertEqual(response.status_code, 302)
post_data = {'name': '2'}
- try:
- response = self.client.post('/test_admin/admin/admin_views/explicitlyprovidedpk/1/', post_data)
- except Exception as e:
- self.fail(e)
+ response = self.client.post(reverse('admin:admin_views_explicitlyprovidedpk_change', args=(1,)), post_data)
self.assertEqual(response.status_code, 302)
def test_implicitly_generated_pk(self):
post_data = {'name': '1'}
- try:
- response = self.client.post('/test_admin/admin/admin_views/implicitlygeneratedpk/add/', post_data)
- except Exception as e:
- self.fail(e)
+ response = self.client.post(reverse('admin:admin_views_implicitlygeneratedpk_add'), post_data)
self.assertEqual(response.status_code, 302)
post_data = {'name': '2'}
- try:
- response = self.client.post('/test_admin/admin/admin_views/implicitlygeneratedpk/1/', post_data)
- except Exception as e:
- self.fail(e)
+ response = self.client.post(reverse('admin:admin_views_implicitlygeneratedpk_change', args=(1,)), post_data)
self.assertEqual(response.status_code, 302)
diff --git a/tests/admin_views/urls.py b/tests/admin_views/urls.py
index 17dc02d102..ba6a89424b 100644
--- a/tests/admin_views/urls.py
+++ b/tests/admin_views/urls.py
@@ -4,10 +4,10 @@ from . import admin, custom_has_permission_admin, customadmin, views
urlpatterns = [
url(r'^test_admin/admin/doc/', include('django.contrib.admindocs.urls')),
- url(r'^test_admin/admin/secure-view/$', views.secure_view),
+ url(r'^test_admin/admin/secure-view/$', views.secure_view, name='secure_view'),
url(r'^test_admin/admin/', include(admin.site.urls)),
url(r'^test_admin/admin2/', include(customadmin.site.urls)),
- url(r'^test_admin/admin3/', include(admin.site.urls), dict(form_url='pony')),
+ url(r'^test_admin/admin3/', include(admin.site.get_urls(), 'admin3', 'admin'), dict(form_url='pony')),
url(r'^test_admin/admin4/', include(customadmin.simple_site.urls)),
url(r'^test_admin/admin5/', include(admin.site2.urls)),
url(r'^test_admin/admin7/', include(admin.site7.urls)),
diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py
index 8949aecd22..cfe0c07e70 100644
--- a/tests/admin_widgets/tests.py
+++ b/tests/admin_widgets/tests.py
@@ -14,6 +14,7 @@ from django.contrib.admin import widgets
from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
from django.core.files.storage import default_storage
from django.core.files.uploadedfile import SimpleUploadedFile
+from django.core.urlresolvers import reverse
from django.db.models import CharField, DateField
from django.test import TestCase as DjangoTestCase, override_settings
from django.utils import six, translation
@@ -174,7 +175,7 @@ class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase):
Ensure the user can only see their own cars in the foreign key dropdown.
"""
self.client.login(username="super", password="secret")
- response = self.client.get("/admin_widgets/cartire/add/")
+ response = self.client.get(reverse('admin:admin_widgets_cartire_add'))
self.assertNotContains(response, "BMW M3")
self.assertContains(response, "Volkswagon Passat")
@@ -188,7 +189,7 @@ class AdminForeignKeyWidgetChangeList(DjangoTestCase):
self.client.login(username="super", password="secret")
def test_changelist_ForeignKey(self):
- response = self.client.get('/admin_widgets/car/')
+ response = self.client.get(reverse('admin:admin_widgets_car_changelist'))
self.assertContains(response, '/auth/user/add/')
@@ -209,7 +210,7 @@ class AdminForeignKeyRawIdWidget(DjangoTestCase):
}
# Try posting with a non-existent pk in a raw id field: this
# should result in an error message, not a server exception.
- response = self.client.post('/admin_widgets/event/add/', post_data)
+ response = self.client.post(reverse('admin:admin_widgets_event_add'), post_data)
self.assertContains(response,
'Select a valid choice. That choice is not one of the available choices.')
@@ -217,7 +218,7 @@ class AdminForeignKeyRawIdWidget(DjangoTestCase):
for test_str in ('Iñtërnâtiônàlizætiøn', "1234'", -1234):
# This should result in an error message, not a server exception.
- response = self.client.post('/admin_widgets/event/add/',
+ response = self.client.post(reverse('admin:admin_widgets_event_add'),
{"main_band": test_str})
self.assertContains(response,
@@ -383,7 +384,7 @@ class AdminFileWidgetTests(DjangoTestCase):
File widgets should render as a link when they're marked "read only."
"""
self.client.login(username="super", password="secret")
- response = self.client.get('/admin_widgets/album/%s/' % self.album.id)
+ response = self.client.get(reverse('admin:admin_widgets_album_change', args=(self.album.id,)))
self.assertContains(
response,
'<p><a href="%(STORAGE_URL)salbums/hybrid_theory.jpg">'
@@ -582,7 +583,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin_widgets/member/add/'))
+ reverse('admin:admin_widgets_member_add')))
# First, with the date picker widget ---------------------------------
# Check that the date picker is hidden
@@ -622,7 +623,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin_widgets/member/add/'))
+ reverse('admin:admin_widgets_member_add')))
# fill in the birth date.
self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01')
@@ -646,7 +647,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin_widgets/member/add/'))
+ reverse('admin:admin_widgets_member_add')))
# fill in the birth date.
self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01')
@@ -672,7 +673,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin_widgets/member/add/'))
+ reverse('admin:admin_widgets_member_add')))
# Click the calendar icon
self.selenium.find_element_by_id('calendarlink0').click()
@@ -718,7 +719,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
# Open a page that has a date picker widget
self.selenium.get('{}{}'.format(self.live_server_url,
- '/admin_widgets/member/{}/'.format(member.pk)))
+ reverse('admin:admin_widgets_member_change', args=(member.pk,))))
# Click on the calendar icon
self.selenium.find_element_by_id('calendarlink0').click()
@@ -772,7 +773,7 @@ class DateTimePickerShortcutsSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase
now = datetime.now()
self.selenium.get('%s%s' % (self.live_server_url,
- '/admin_widgets/member/add/'))
+ reverse('admin:admin_widgets_member_add')))
self.selenium.find_element_by_id('id_name').send_keys('test')
@@ -949,8 +950,8 @@ class HorizontalVerticalFilterSeleniumFirefoxTests(AdminSeleniumWebDriverTestCas
self.school.save()
self.admin_login(username='super', password='secret', login_url='/')
- self.selenium.get(
- '%s%s' % (self.live_server_url, '/admin_widgets/school/%s/' % self.school.id))
+ self.selenium.get('%s%s' % (
+ self.live_server_url, reverse('admin:admin_widgets_school_change', args=(self.school.id,))))
self.wait_page_loaded()
self.execute_basic_operations('vertical', 'students')
@@ -978,7 +979,7 @@ class HorizontalVerticalFilterSeleniumFirefoxTests(AdminSeleniumWebDriverTestCas
self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get(
- '%s%s' % (self.live_server_url, '/admin_widgets/school/%s/' % self.school.id))
+ '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_school_change', args=(self.school.id,))))
for field_name in ['students', 'alumni']:
from_box = '#id_%s_from' % field_name
@@ -1079,7 +1080,7 @@ class AdminRawIdWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_ForeignKey(self):
self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get(
- '%s%s' % (self.live_server_url, '/admin_widgets/event/add/'))
+ '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_event_add')))
main_window = self.selenium.current_window_handle
# No value has been selected yet
@@ -1114,7 +1115,7 @@ class AdminRawIdWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_many_to_many(self):
self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get(
- '%s%s' % (self.live_server_url, '/admin_widgets/event/add/'))
+ '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_event_add')))
main_window = self.selenium.current_window_handle
# No value has been selected yet
@@ -1166,7 +1167,7 @@ class RelatedFieldWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get('%s%s' % (
self.live_server_url,
- '/admin_widgets/profile/add/'))
+ reverse('admin:admin_widgets_profile_add')))
main_window = self.selenium.current_window_handle
# Click the Add User button to add new