【问题标题】:Image fields or Boolean fields in django forms widgets?django表单小部件中的图像字段或布尔字段?
【发布时间】:2021-04-17 11:37:00
【问题描述】:

我正在尝试在小部件字典中添加一个图像字段,但我不知道表单的属性是什么。像 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'}),
        }

【问题讨论】:

标签: django widget modelform


【解决方案1】:

您可以使用两个file inputs。如果允许您删除图像(即将其设置为空白/空),则应使用 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 或基类中,用于您的所有表单。

就个人而言,我建议不要在 Python 中做任何这些,而是​​在 HTML 模板中做这些,这样就可以清楚这些类的来源。

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 2015-10-06
    • 2018-07-05
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多