是否可以删除“当前'使用django-stdimage时的标签?

时间:2017-01-19 18:34:14

标签: python django imagefield django-widget

我在我的Django应用中使用django-stdimage并且效果很好,唯一的问题是我想删除“当前”#39;字符串,清除复选框和HTML模板中的其余装饰。我无法弄清楚如何实现这一目标。

这是我models.py中的StdImageField声明:

photo = StdImageField(upload_to=join('img', 'agents'),
                      variations={'thumbnail': (100, 100, True)}, default=None,
                      null=True, blank=True, )

我已经阅读了几个关于修改ImageField小部件以使用类ClearableFileInput的答案,但似乎widget属性不允许作为StdImageField类参数。

有没有办法删除所有这些装饰?

谢谢。

1 个答案:

答案 0 :(得分:4)

StdImageField extends Django的ImageField

Django的ImageField defines 'form_class': forms.ImageField

和Django的forms.ImageField默认小部件是:ClearableFileInput

因此,如果您想要在model.fields级别更改此小部件,则需要扩展StdImageField并覆盖formfield方法以返回form_lass form.field 1}}有另一个默认小部件。

一个简单的示例解决方案应如下所示:

class NotClearableImageField(forms.ImageField):
    widget = forms.FileInput


class MyStdImageField(StdImageField):
    def formfield(self, **kwargs):
        kwargs.update({'form_class': NotClearableImageField})
        return super(MyStdImageField, self).formfield(**defaults)

# Now you can use MyStdImageField
# in your model instead of StdImageField
class MyModel(models.Model):
    my_image = MyStdImageField(*args, **kwargs)

但这将是影响所有ModelForm扩展Model(包括Django管理员)的更改。

您可能不希望这样做,而您可以做的是仅在您想要此特定行为的单个form上应用此窗口小部件覆盖。 ModelForms已经支持这一点:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = '__all__'
        widgets = {
            'my_image': forms.FileInput(),
        }

现在,您可以在要更改的位置使用此表单类。