Django 表单小部件中的图像字段或布尔字段?

Image fields or Boolean fields in django forms widgets?

我正在尝试在小部件字典中添加一个图像字段,但我不知道 属性 用于表单的是什么来执行此操作。像 forms.TextInput 我应该为图像字段或布尔字段使用什么? 这里的代码在小部件字典的图像 属性 中给我错误。

class CreateProductForm(ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'price', 'category', 'description', 'image']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'price': forms.NumberInput(attrs={'class': 'form-control'}),
            'category': forms.Select(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control'}),
            'image': forms.ImageInput(attrs={'class': 'form-control'}),
        }

有两个 file inputs 您可以使用。如果允许删除图像(即将其设置为 blank/null),则应使用 ClearableFileInput。如果不是FileInput是正确的选择。

同样对于布尔值,CheckboxInput 是 Django 的默认值。

class CreateProductForm(ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'price', 'category', 'description', 'my_bool', 'image']
        widgets = {
            'my_bool': forms.CheckboxInput(attrs={'class': 'form-control'}),
            'image': forms.ClearableFileInput(attrs={'class': 'form-control', 'accept': 'image/*'}),
        }

与其覆盖所有小部件,不如覆盖 __init__

class CreateProductForm(ModelForm):
    ...

    def __init__(self, *args, **kwargs)
        super().__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs.update({'class': 'form-control'})

你甚至可以把它放到一个单独的 mixin 或 base class 中用于你所有的表单。

就我个人而言,我建议不要在 Python 中执行任何操作,而是在 HTML 模板中执行此操作,这样就可以清楚地了解 classes 的来源。