Elevator
Elevator

Reputation: 11

User avatar not displayed in Django

I want to user have a avatar. So I created the model and the form.
Image is not displaying on the page. But form saves the image to folder. Where is mistake?

request.user.avatar.url doesn't work. Maybe the image is not attached to User? Thanks for the help

P.S. djagno-avatar is not good for me.

models.py

class Avatar(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT, null=True)
    avatar = models.ImageField(upload_to='user_avatars', null=True)

forms.py

class UserPhotoForm(forms.ModelForm):
    class Meta:
        model = Avatar
        fields = ('avatar', )
        widgets = {
            'avatar': forms.FileInput(attrs={'class': 'input'}),
        }

views.py

def cabinet(request):
    user = request.user
    if request.method == 'POST':
        form = UserPhotoForm(request.POST, request.FILES, instance=user)
        if form.is_valid():
            form.save()
    else:
        form = UserPhotoForm()
    return render(request, 'account/cabinet/cabinet.html', {'form': form})

cabinet.html

<div class="avatar">
     {{ request.user.avatar.url }} #there is trying
     {{ request.user.avatar.avatar.url }}
     <img src="{{ request.user.avatar.avatar.url }}" alt="" width="80px" height="80px">
     <form method="POST" enctype="multipart/form-data">
         {% csrf_token %}
         {{ form.as_p }}
         <input type="submit" id="file"/>
     </form>

Upvotes: 0

Views: 560

Answers (2)

SaGaR
SaGaR

Reputation: 542

Found the main problem you are never storing your avatar model in db. As you are giving it the instance of your user. Because of that your Avatar model is not stored. You have to use

def cabinet(request):
    user = request.user
    if request.method == 'POST':
        form = UserPhotoForm(request.POST,request.FILES)
        if form.is_valid():
            temp=form.save(commit=False)
            temp.user = user
            temp.save()
    else:
        form = UserPhotoForm()
    return render(request, 'account/cabinet/cabinet.html', {'form': form})

Try that

Upvotes: 0

rahul.m
rahul.m

Reputation: 5854

try this

 <img src="{{ request.user.avatar.url }}" alt="" width="80px" height="80px">

https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.ImageField

Upvotes: 0

Related Questions