how to correctly saving a profile instance in django

Viewed 189

I have a problem with creating a profile instance in Django. when I try to update a profile the images of the profile don't save in the database My guess is that the form.save(commit=False) does not upload the photo nor update the field as it should but I do not understand why : here is my code:

models.py

class Profile(models.Model):
user         = models.OneToOneField(User, primary_key =True, on_delete=models.CASCADE, related_name= 'profile')
image        = models.OneToOneField(UserImage, on_delete=models.SET_NULL, null=True, blank=True)
phone_number = models.CharField(max_length=50, null = True, blank = True)
followers    = models.ManyToManyField(User, related_name='follower', blank=True)
following    = models.ManyToManyField(User, related_name='following', blank=True)
biography    = models.TextField(max_length=250, null=True, blank=True)

class UserImage(models.Model):
avatar       = models.ImageField(blank=True, null=True,upload_to='avatar_pic')                                  
header_image = models.ImageField(blank=True, null=True,upload_to='header_pic')
                                    
                                    

forms.py

class ProfileForm(ModelForm):
class Meta:
    model = Profile
    fields = (
        'phone_number',
        'biography',
        )

class ImageProfileForm(ModelForm):

class Meta:
    model = UserImage
    fields = (
        'avatar',
        'header_image',
        )

views.py

@login_required
def CompleteSignUp(request):

if request.method == 'POST':
    profile_form = ProfileForm(request.POST,request.FILES ,instance=request.user.profile)
    image_profile_form = ImageProfileForm(request.POST, instance=request.user.profile.image)
    if profile_form.is_valid() and image_profile_form.is_valid():
        profile = profile_form.save(commit=False)
        images  = image_profile_form.save()
        profile.user = request.user
        profile.social = social
        profile.image = images
        profile_form.save()
        return redirect('blog:Home')
else:
    profile_form = ProfileForm(
                                initial={
                                    'phone_number':request.user.profile.phone_number,
                                    'biography':request.user.profile.biography
                                    }
                            )
    if request.user.profile.image:
        image_profile_form = ImageProfileForm(
                                            initial={
                                                'avatar':request.user.profile.image.avatar,
                                                'header_image':request.user.profile.image.header_image
                                            }
                                    )
    else:
        image_profile_form = ImageProfileForm()
    return render(request, 'user/createprofile.html', {'form_p': profile_form, 'form_i': image_profile_form})

templates

{% block content %}
<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div>
        {{ form_p.biography }}
        biography 
    </div>
    <div>
        {{ form_p.phone_number }}
        phone_number
    </div>
    <div>
        {{ form_i.avatar }}
        avatar
    </div>
    <div>
        {{ form_i.header_image }}
        header
    </div>


 <br>
    <input type="submit" value="Register">
</br>

</form>
    {% for field in form_s %}
        {% for error in field.errors %}
        <p style="color: rgba(255, 0, 0, 0.678)">{{ error }}</p>
        {% endfor %}
    {% endfor %}

{% endblock %}

profile save but the image of the profile doesn't save what's my fault. ...

1 Answers

Change:

        profile.user = request.user
        profile.social = social
        profile.image = images
        profile_form.save()

To:

        profile.user = request.user
        profile.social = social
        profile.image = images
        profile.save() # Use this

You need to save profile instead of the form with commit=False, because you did custom stuff to profile.

Related