-1

I'm trying to let my users update their profile from the front-end allowing it to reflect at the django admin particularly updating of profile image. The change of user.first_name and user.last_name works fine except from the image which also doesn't reflect at the back end. I think i'm missing something plus when the fields for firstname and lastname are empty it post as null I think I'd use an exception for that but i'm more concerned with the profile image. Please Help me I'm not getting it

here is my code

#views.py
    def edit_user_profile(request, username):
        user = request.user
        form = EditProfileForm(request.POST or None, request.FILES, initial={'first_name': user.first_name, 'last_name': user.last_name})
        if request.method == 'POST':
            if form.is_valid():
                # user.photo = UserExtended(photo=request.FILES['photo'] or None, )
                photo = UserExtended.objects.get(user=user)
                user.first_name = request.POST['first_name']
                user.last_name = request.POST['last_name']
                # username = request.POST['username']
                photo.save()
                user.save()
                context = {
                    'form': form,
                }

                return render(request, 'accounts/profile_updated.html', context)
        context = {
            'form': form,
            'username': username,

        }

        return render(request, 'accounts/edit_profile.html', context)

#model.py
    @python_2_unicode_compatible  # only if you need to support Python 2
    class UserExtended(models.Model):
        user = models.OneToOneField(User, related_name='user')
        photo = models.ImageField(upload_to='media/user_media/users', verbose_name='Profile Picture',
                                  default='/media/user_media/avatars/avatar.png', blank=True)
        address = models.CharField(max_length=255)
        phoneNumber = models.CharField(max_length=11)

        class Meta:
            verbose_name_plural = _("user")

        def __str__(self):
            return self.user.username

        def image_tag(self):
            if self.photo:
                return mark_safe('<img src="/media/%s" width="150" height="150" />' % self.photo)
            else:
                return mark_safe('<img src="/media/user_media/avatars/avatar.png" width="150" height="150" />')

        image_tag.allow_tags = True
        image_tag.short_description = 'Profile Avatar'


    def create_profile(sender, **kwargs):
        user = kwargs["instance"]
        if kwargs["created"]:
            user_extended = UserExtended(user=user)
            user_extended.save()


    post_save.connect(create_profile, sender=User)


#forms.py

    class EditProfileForm(forms.ModelForm):
        first_name = forms.CharField(label='First Name', widget=forms.TextInput(attrs={'class': 'form-control'}),
                                     required=False)
        last_name = forms.CharField(label='Last Name', widget=forms.TextInput(attrs={'class': 'form-control'}),
                                    required=False)
        # username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}), required=True)
        photo = forms.ImageField(label='Change Profile Image', required=False)

        class Meta:
            model = User
            fields = ['photo', 'first_name', 'last_name', ]  # 'username',
            """

Thank you in advance..

Durodola Opemipo
  • 319
  • 2
  • 12

1 Answers1

0

OK so while debugging with PyCharm, I discovered I was using the instance of my User class instead of my UserExtended which had the photo. I guess I got too comfortable since I was posting user.fist_name and user.last_name. This is the solution:

#views.py
def edit_user_profile(request, username):
    user = request.user
    form = EditProfileForm(request.POST or None, request.FILES, initial={'first_name': user.first_name, 'last_name': user.last_name})
    if request.method == 'POST':
        if form.is_valid():
            #photo = UserExtended(photo=request.FILES['photo'] or None, )
            user_extended = UserExtended.objects.get(user=user)
            user.first_name = request.POST['first_name']
            user.last_name = request.POST['last_name']
            user_extended.photo = form.cleaned_data["photo"]
            # username = request.POST['username']
            user_extended.save()
            user.save()
            context = {
                'form': form,
            }

            return render(request, 'accounts/profile_updated.html', context)
    context = {
        'form': form,
        'username': username,

    }

    return render(request, 'accounts/edit_profile.html', context)
Eje
  • 354
  • 4
  • 8
Durodola Opemipo
  • 319
  • 2
  • 12