26

我看了下面的 SO question,但没有运气。我不知道,也许我没看懂答案。

1)如何在 Django 中删除 FileInput 小部件的“当前”标签和链接?

2) Django ModelForm ImageField

我的表格:

class SettingsForm(forms.ModelForm):
    company_logo = forms.ImageField(label=_('Company Logo'),required=False, error_messages = {'invalid':_("Image files only")})
    class Meta:
        model = Settings
        fields = ("company_logo")
    ....

我的模型:

class Settings(models.Model):
    strg=CustomFileSystemStorage(strict_name='images/company_logo.png',save_format='PNG')
    company_logo=models.ImageField(upload_to='images',blank=True,null=True,storage=strg)
    .....

渲染后:

像场

我从第一个链接中看到,models.ImageField继承FileInput并添加了额外的东西,但我不明白如何克服这个问题?

提前致谢。

4

3 回答 3

34

解决方案是:

class SettingsForm(forms.ModelForm):
    company_logo = forms.ImageField(label=_('Company Logo'),required=False, error_messages = {'invalid':_("Image files only")}, widget=forms.FileInput)
    class Meta:
        model = Settings
        fields = ("company_logo")
    ....

我添加了小部件forms.FileInput,以便告诉 ImageField 使用基本字段,而不是继承自FileInput.

于 2013-01-15T13:03:52.840 回答
9

@mtndesign,您可能还需要一个“删除”选项,您可以将其放置在模板中的任何位置。

class MyForm(forms.ModelForm):
    photo = forms.ImageField(required=False, widget=forms.FileInput)
    remove_photo = forms.BooleanField(required=False)

    ...

    def save(self, commit=True):
        instance = super(MyForm, self).save(commit=False)
        if self.cleaned_data.get('remove_photo'):
            try:
                os.unlink(instance.photo.path)
            except OSError:
                pass
            instance.photo = None
        if commit:
            instance.save()
        return instance
于 2013-07-18T23:54:33.927 回答
7

您可以通过在初始化时指定它来更改用于呈现表单字段的小部件:

class SettingsForm(forms.ModelForm):
    company_logo = forms.ImageField(label=_('Company Logo'),required=False, \
                                    error_messages ={'invalid':_("Image files only")},\
                                    widget=FileInput)

请参阅小部件的文档

于 2013-01-15T13:03:28.033 回答