Django пользовательская форма attrs удаляет css класс

Я имею дело с RTL CharField, поэтому я имплементировал следующее в моем admin.py:

class CustomPostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'slug', 'lead', 'body', 'status', 'is_featured']
        widgets = {'title': forms.TextInput(attrs={'dir': 'rtl'})}


@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    form = CustomPostForm

Это работает нормально, за исключением того, что когда я смотрю на форму на сайте администратора, ширина RTL-поля меньше, чем ширина следующего LTR-поля:

enter image description here

А если я удалю всю пользовательскую форму, то оба поля выглядят одинаково:

enter image description here

Я изучаю код и понимаю, что поле slug имеет класс css под названием vTextField, и если я изменю attrs пользовательской формы, оба поля будут выглядеть одинаково:

widgets = {'title': forms.TextInput(attrs={'dir': 'rtl', 'class': 'vTextField'})}

Итак, мой вопрос в том, нормально ли это или намеренно для Django удалять CSS класс, если используется attrs, и мой подход к установке класса обратно правильный, или я что-то упускаю?

Вы заменяете атрибуты {'class': 'vTextField'} на {'dir': 'rtl'}. Так что да, оригинальные attrs заменяются на ваши. Это нормально и ожидаемо.

Добавьте атрибут внутри метода init:

class CustomPostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'slug', 'lead', 'body', 'status', 'is_featured']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['title'].widget.attrs['dir'] = 'rtl'
Вернуться на верх