0xmtn
0xmtn

Reputation: 2670

How to not render django image field currently and clear stuff?

I took a look at following SO question, but had no luck. I don't know, maybe I didn't understand the answers.

1) How to remove the “Currently” tag and link of a FileInput widget in Django?

2) Django ModelForm ImageField

My form:

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")
    ....

My model:

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)
    .....

After rendering:

imagefield

I see from the first link, that the models.ImageField inherits the FileInput and adds the extra stuff, but I do not understand how to overcome this?

Thanks in advance.

Upvotes: 26

Views: 19450

Answers (3)

s29
s29

Reputation: 2057

@mtndesign, you might also want a "remove" option, which you can place wherever you like in your template.

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

Upvotes: 9

0xmtn
0xmtn

Reputation: 2670

The solution is:

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")
    ....

I added the widget forms.FileInput, in order to tell the ImageField to use the basic field, not the one inherited from FileInput.

Upvotes: 34

XORcist
XORcist

Reputation: 4367

You can change the widget used to render the form field by specifying it on initializing:

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

See the docs for widgets.

Upvotes: 7

Related Questions