[ Can´t save images on Django Model after extending it ]

I´m having a really hard time with this. I have extended the Django user model. I created a separate app call "userprofile" (i have 2 apps: 'userprofile' and 'Administration') with new models.py:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    profile_image = models.ImageField(upload_to="/perfil/", blank=True, null=True)


User.profile = property(lambda u: UserProfile.objects.get_or_create(user = u)[0])

the urls.py:

urlpatterns = patterns('',
    url(r'^perfil/$', 'apps.userprofile.views.user_profile',  name= 'perfil'),
)

and a views.py:

# Create your views here.
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from forms import UserProfileForm
from django.contrib.auth.decorators import login_required

@login_required
def user_profile(request):
    if request.method == 'POST':
        form = UserProfileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('../index')
    else:
        user = request.user
        profile = user.profile
        form = UserProfileForm(instance = profile)

    args = {}
    args.update(csrf(request))

    args['form'] = form

    return render_to_response('profile.html', args)

and of course a forms.py:

from django import forms
from models import UserProfile

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout
from crispy_forms.bootstrap import (FormActions, )

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile

    helper = FormHelper()
    helper.form_method = 'POST'
    helper.layout = Layout(
        'profile_image',
        FormActions(Submit('Editar', 'Editar', css_class= 'btn-primary'))
        )

    def save(self,  commit=True):
        fact = super(UserProfileForm, self).save(commit=False)
        if commit:
            fact.save()
        return fact

So, what i´m trying to do is to let the user upload an image an let it use it as a profile image. I set the:

AUTH_PROFILE_MODULE = 'apps.userprofile.UserProfile'  (the app is inside a folder call 'apps' that´s why the first 'apps' before userprofile)

in the settings.py, and i added the urls of 'userprofile' to the main project. Now I have the template where i can upload an image, the problem is that the image is never saved in the database so I can´t call a function to display the image in a template, let´s say the User Profile page.

Does anyone looking at the code knows what I am doing wrong?

Answer 1


According to the Django 1.7 docs, ModelForm classes must explicitly specify which fields should be updated when the save() method is called. Try adding fields = __all__ to your UserProfileForm class meta.

Relevant section of ModelForm documentation

Notice the first line of the Note in that link:

Any fields not included in a form by the above logic will not be set by the form’s save() method.

I am still learning Django myself but that's what I would try first. :)