Skip to content

Commit

Permalink
fix: Fix admin widget for fk fields (#662)
Browse files Browse the repository at this point in the history
Refs #660
  • Loading branch information
Hafnernuss committed Nov 22, 2022
1 parent 5ab3a45 commit fcfbd5c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
11 changes: 9 additions & 2 deletions modeltranslation/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def patch_translation_field(self, db_field, field, request, **kwargs):
db_field.empty_value == 'both' or orig_field.name in self.both_empty_values_fields
) and isinstance(field.widget, (forms.TextInput, forms.Textarea)):
field.widget = ClearableWidgetWrapper(field.widget)
css_classes = field.widget.attrs.get('class', '').split(' ')
css_classes = self._get_widget_from_field(field).attrs.get('class', '').split(' ')
css_classes.append('mt')
# Add localized fieldname css class
css_classes.append(build_css_class(db_field.name, 'mt-field'))
Expand All @@ -116,7 +116,14 @@ def patch_translation_field(self, db_field, field, request, **kwargs):
# Hide clearable widget for required fields
if isinstance(field.widget, ClearableWidgetWrapper):
field.widget = field.widget.widget
field.widget.attrs['class'] = ' '.join(css_classes)
self._get_widget_from_field(field).attrs['class'] = ' '.join(css_classes)

def _get_widget_from_field(self, field):
# retrieve "nested" widget in case of related field
if isinstance(field.widget, admin.widgets.RelatedFieldWidgetWrapper):
return field.widget.widget
else:
return field.widget

def _exclude_original_fields(self, exclude=None):
if exclude is None:
Expand Down
17 changes: 17 additions & 0 deletions modeltranslation/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2172,6 +2172,23 @@ def formfield_for_dbfield(self, db_field, request, **kwargs):
in ma.get_form(request, self.test_obj).base_fields.get(field).widget.attrs.values()
)

def test_widget_classes_appended_by_formfield_for_dbfield(self):
'''
regression test for #660 (https://github.com/deschler/django-modeltranslation/issues/660)
'''
class ForeignKeyModelModelAdmin(admin.TranslationAdmin):
fields = ['test']

class OneToOneFieldModelAdmin(admin.TranslationAdmin):
fields = ['test']

ma = ForeignKeyModelModelAdmin(models.ForeignKeyModel, self.site)
fields = ['test_de', 'test_en']
for field in fields:
assert {} == ma.get_form(request).base_fields.get(field).widget.attrs
assert 'class' in ma.get_form(request).base_fields.get(field).widget.widget.attrs.keys()
assert 'mt' in ma.get_form(request).base_fields.get(field).widget.widget.attrs['class']

def test_inline_fieldsets(self):
class DataInline(admin.TranslationStackedInline):
model = models.DataModel
Expand Down

0 comments on commit fcfbd5c

Please sign in to comment.