Django 自定义表单属性删除 css class

Django custom form attrs removes css class

我正在处理 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 字段:

如果我删除整个自定义表单,那么两个字段看起来都一样:

所以我检查了代码,发现 slug 字段有一个名为 vTextFieldcss class,如果我更改自定义表单的 attrs两个字段看起来一样:

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

所以我的问题是,如果使用 CSS class,Django 删除 CSS class 是正常的还是有意的,我将 class 放回去的方法是正确,还是我遗漏了什么?

您正在用 {'dir': 'rtl'} 替换属性 {'class': 'vTextField'}。所以是的,原来的 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'