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..4bfb442 100644 --- a/modeltranslation/tests/tests.py +++ b/modeltranslation/tests/tests.py @@ -2200,6 +2200,35 @@ 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)) + + 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