diff options
-rw-r--r-- | django/contrib/admin/templates/admin/change_form.html | 6 | ||||
-rw-r--r-- | django/forms/forms.py | 11 | ||||
-rw-r--r-- | tests/regressiontests/admin_views/models.py | 5 | ||||
-rw-r--r-- | tests/regressiontests/admin_views/tests.py | 23 |
4 files changed, 42 insertions, 3 deletions
diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index 7c96628963..08347abe78 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -16,8 +16,8 @@ {% block breadcrumbs %}{% if not is_popup %} <div class="breadcrumbs"> <a href="../../../">{% trans "Home" %}</a> › - <a href="../../">{{ app_label|capfirst|escape }}</a> › - {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} › + <a href="../../">{{ app_label|capfirst|escape }}</a> › + {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} › {% if add %}{% trans "Add" %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %} </div> {% endif %}{% endblock %} @@ -56,7 +56,7 @@ {% submit_row %} {% if adminform and add %} - <script type="text/javascript">document.getElementById("{{ adminform.first_field.auto_id }}").focus();</script> + <script type="text/javascript">document.getElementById("{{ adminform.first_field.id_for_label }}").focus();</script> {% endif %} {# JavaScript for prepopulated fields #} diff --git a/django/forms/forms.py b/django/forms/forms.py index 46e97ef5b9..b520d7e32e 100644 --- a/django/forms/forms.py +++ b/django/forms/forms.py @@ -518,3 +518,14 @@ class BoundField(StrAndUnicode): return self.html_name return '' auto_id = property(_auto_id) + + def _id_for_label(self): + """ + Wrapper around the field widget's `id_for_label` class method. + Useful, for example, for focusing on this field regardless of whether + it has a single widget or a MutiWidget. + """ + widget = self.field.widget + id_ = widget.attrs.get('id') or self.auto_id + return widget.id_for_label(id_) + id_for_label = property(_id_for_label) diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py index b840c0a4b5..60d8d06942 100644 --- a/tests/regressiontests/admin_views/models.py +++ b/tests/regressiontests/admin_views/models.py @@ -629,6 +629,10 @@ class WorkHourAdmin(admin.ModelAdmin): list_display = ('datum', 'employee') list_filter = ('employee',) +class Reservation(models.Model): + start_date = models.DateTimeField() + price = models.IntegerField() + admin.site.register(Article, ArticleAdmin) admin.site.register(CustomArticle, CustomArticleAdmin) admin.site.register(Section, save_as=True, inlines=[ArticleInline]) @@ -664,6 +668,7 @@ admin.site.register(PlotDetails) admin.site.register(CyclicOne) admin.site.register(CyclicTwo) admin.site.register(WorkHour, WorkHourAdmin) +admin.site.register(Reservation) # We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2. # That way we cover all four cases: diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 97f9061a23..384959c500 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -376,6 +376,29 @@ class AdminViewBasicTest(TestCase): except SuspiciousOperation: self.fail("Filters should be allowed if they are defined on a ForeignKey pointing to this model") +class AdminJavaScriptTest(AdminViewBasicTest): + def testSingleWidgetFirsFieldFocus(self): + """ + JavaScript-assisted auto-focus on first field. + """ + response = self.client.get('/test_admin/%s/admin_views/picture/add/' % self.urlbit) + self.assertContains( + response, + '<script type="text/javascript">document.getElementById("id_name").focus();</script>' + ) + + def testMultiWidgetFirsFieldFocus(self): + """ + JavaScript-assisted auto-focus should work if a model/ModelAdmin setup + is such that the first form field has a MultiWidget. + """ + response = self.client.get('/test_admin/%s/admin_views/reservation/add/' % self.urlbit) + self.assertContains( + response, + '<script type="text/javascript">document.getElementById("id_start_date_0").focus();</script>' + ) + + class SaveAsTests(TestCase): fixtures = ['admin-views-users.xml','admin-views-person.xml'] |