From 222e04822ef01245b4b4857bbbeb025e2d7d7cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Borislav=20Petrovi=C4=87?= Date: Fri, 29 Jun 2018 16:25:12 +0200 Subject: [PATCH 1/2] fix: copy form defined widget attrs --- modeltranslation/admin.py | 6 ++++++ modeltranslation/tests/tests.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/modeltranslation/admin.py b/modeltranslation/admin.py index d2ed19a..6097bb4 100755 --- a/modeltranslation/admin.py +++ b/modeltranslation/admin.py @@ -66,6 +66,12 @@ class TranslationBaseModelAdmin(BaseModelAdmin): else: orig_formfield = self.formfield_for_dbfield(orig_field, **kwargs) field.widget = deepcopy(orig_formfield.widget) + # if any widget attrs are defined on the form they should be copied + try: + field.widget = deepcopy(self.form._meta.widgets[orig_field.name]) + except (AttributeError, TypeError, KeyError): + pass + # field.widget = deepcopy(orig_formfield.widget) if orig_field.name in self.both_empty_values_fields: from modeltranslation.forms import NullableField, NullCharField form_class = field.__class__ diff --git a/modeltranslation/tests/tests.py b/modeltranslation/tests/tests.py index 22d2b23..8f82778 100644 --- a/modeltranslation/tests/tests.py +++ b/modeltranslation/tests/tests.py @@ -2200,6 +2200,34 @@ class TranslationAdminTest(ModeltranslationTestBase): self.assertEqual( tuple(ma.get_form(request, self.test_obj).base_fields.keys()), tuple(fields)) + def test_model_form_widgets(self): + class TestModelForm(forms.ModelForm): + class Meta: + model = models.TestModel + fields = ['text',] + widgets = { + 'text': forms.Textarea(attrs={'myprop': 'myval'}), + } + + class TestModelAdmin(admin.TranslationAdmin): + form = TestModelForm + + ma = TestModelAdmin(models.TestModel, self.site) + fields = ['text_de', 'text_en'] + self.assertEqual( + tuple(ma.get_form(request).base_fields.keys()), tuple(fields)) + self.assertEqual( + tuple(ma.get_form(request, self.test_obj).base_fields.keys()), tuple(fields)) + + mf = TestModelForm(instance=self.test_obj) + for field in fields: + self.assertIn('myprop', + ma.get_form(request).base_fields.get(field).widget.attrs.keys() + ) + self.assertIn('myval', + ma.get_form(request, self.test_obj).base_fields.get(field).widget.attrs.values() + ) + def test_inline_fieldsets(self): class DataInline(admin.TranslationStackedInline): model = models.DataModel From 458df66cb95f26eadb7628fec6d4a4bd3fc51703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Borislav=20Petrovi=C4=87?= Date: Fri, 29 Jun 2018 16:42:37 +0200 Subject: [PATCH 2/2] style: fixing flake8 warnings --- modeltranslation/tests/tests.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modeltranslation/tests/tests.py b/modeltranslation/tests/tests.py index 8f82778..4bfb442 100644 --- a/modeltranslation/tests/tests.py +++ b/modeltranslation/tests/tests.py @@ -2204,7 +2204,7 @@ class TranslationAdminTest(ModeltranslationTestBase): class TestModelForm(forms.ModelForm): class Meta: model = models.TestModel - fields = ['text',] + fields = ['text', ] widgets = { 'text': forms.Textarea(attrs={'myprop': 'myval'}), } @@ -2219,12 +2219,13 @@ class TranslationAdminTest(ModeltranslationTestBase): self.assertEqual( tuple(ma.get_form(request, self.test_obj).base_fields.keys()), tuple(fields)) - mf = TestModelForm(instance=self.test_obj) for field in fields: - self.assertIn('myprop', + self.assertIn( + 'myprop', ma.get_form(request).base_fields.get(field).widget.attrs.keys() ) - self.assertIn('myval', + self.assertIn( + 'myval', ma.get_form(request, self.test_obj).base_fields.get(field).widget.attrs.values() )