From 491419b5ffac3752a1c1804a763c017a2ed82e16 Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Sun, 19 May 2013 16:28:33 -0300 Subject: [PATCH] Made m2m fields form help_text munging specific to admin widgets. Refs #9321 and follow-up to e80de93af6a0a21a9063a55c4d6d20e3927243e9. --- django/contrib/admin/options.py | 9 ++++++++- tests/admin_widgets/tests.py | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index b9049001e02..05c7564b449 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -30,6 +30,7 @@ from django.db.models.sql.constants import QUERY_TERMS from django.forms.formsets import all_valid, DELETION_FIELD_NAME from django.forms.models import (modelform_factory, modelformset_factory, inlineformset_factory, BaseInlineFormSet, modelform_defines_fields) +from django.forms.widgets import SelectMultiple, CheckboxSelectMultiple from django.http import Http404, HttpResponseRedirect from django.http.response import HttpResponseBase from django.shortcuts import get_object_or_404 @@ -41,6 +42,7 @@ from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.html import escape, escapejs from django.utils.http import urlencode from django.utils.text import capfirst, get_text_list +from django.utils.translation import string_concat from django.utils.translation import ugettext as _ from django.utils.translation import ungettext from django.utils.safestring import mark_safe @@ -280,7 +282,12 @@ class BaseModelAdmin(six.with_metaclass(forms.MediaDefiningClass)): if queryset is not None: kwargs['queryset'] = queryset - return db_field.formfield(**kwargs) + form_field = db_field.formfield(**kwargs) + if isinstance(form_field.widget, SelectMultiple) and not isinstance(form_field.widget, CheckboxSelectMultiple): + msg = _('Hold down "Control", or "Command" on a Mac, to select more than one.') + help_text = form_field.help_text + form_field.help_text = string_concat(help_text, ' ', msg) if help_text else msg + return form_field def get_view_on_site_url(self, obj=None): if obj is None or not self.view_on_site: diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py index 939fb65a04a..86fb611f00d 100644 --- a/tests/admin_widgets/tests.py +++ b/tests/admin_widgets/tests.py @@ -19,6 +19,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.db.models import CharField, DateField from django.test import TestCase as DjangoTestCase from django.test import override_settings +from django.utils import six from django.utils import translation from . import models @@ -168,6 +169,17 @@ class AdminFormfieldForDBFieldTests(TestCase): def testInheritance(self): self.assertFormfield(models.Album, 'backside_art', widgets.AdminFileWidget) + def test_m2m_widgets(self): + """m2m fields help text as it applies to admin app (#9321).""" + class AdvisorAdmin(admin.ModelAdmin): + filter_vertical = ['companies'] + + self.assertFormfield(models.Advisor, 'companies', widgets.FilteredSelectMultiple, + filter_vertical=['companies']) + ma = AdvisorAdmin(models.Advisor, admin.site) + f = ma.formfield_for_dbfield(models.Advisor._meta.get_field('companies'), request=None) + self.assertEqual(six.text_type(f.help_text), 'Hold down "Control", or "Command" on a Mac, to select more than one.') + @override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase):