Micah Pearce
Micah Pearce

Reputation: 1935

How to save an image via class based viewto database in Django

I have an profile update form that updates name just fine, however it doesn't update the image. I'm not sure why. I'm not exactly sure where in the class based view the name gets updated for that matter... I know you need to clean your image, but first I'm trying to just upload it.

views.py

class UserDetailUpdateView(LoginRequiredMixin, UpdateView):
    form_class = UserDetailChangeForm
    template_name = 'accounts/detail-update-view.html'

    def get_object(self):
        return self.request.user

    def get_context_data(self, *args, **kwargs):
        context = super(UserDetailUpdateView, self).get_context_data(*args, **kwargs)
        context['title'] = 'Change Your Account Details'
        return context

    def get_success_url(self):
        return reverse("account:home")

In the forms.py, I tried creating the below code, but it returns a NoneType.

def clean_avatar(self):
         avatar = self.cleaned_data['avatar']

forms.py

class UserDetailChangeForm(forms.ModelForm):
    full_name = forms.CharField(label='Name', required=False, widget=forms.TextInput(attrs={"class": 'form-control'}))

    class Meta:
        model = User
        fields = ['full_name','avatar']

html

<input type="file" name="avatar" id="id_avatar">
<button type='submit' class='btn btn-default my-3'>Save</button>

models.py

class User(AbstractBaseUser):
email       = models.EmailField(max_length=255, unique=True)
full_name   = models.CharField(max_length=255, blank=True, null=True)
avatar      = models.ImageField(upload_to='images/', blank=True)
...

Upvotes: 0

Views: 535

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47354

You need to specify form's enctype in HTML for file upload:

<form method="post" enctype="multipart/form-data">
    <input type="file" name="avatar" id="id_avatar">
    <button type='submit' class='btn btn-default my-3'>Save</button>
</form>

Upvotes: 1

Related Questions