Изображение загружено, но не сохранено на носителе и в базе данных Django

Я создаю страницу настроек, где пользователь должен иметь возможность изменить изображение и биоданные. Но только биоданные обновляются, когда я печатаю запрос. FILES.GET(profile_picture) печатает имя фотографии, которую я загрузил. почему не загружается и не сохраняется в базу?

Models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
    profile_pic = models.ImageField(upload_to="images/", null=True ,blank=True)
    bio = models.TextField(max_length=100, blank=True)

формы.py

class ProfileForm(forms.Form):
    profile_picture = forms.ImageField(required=False )
    bio = forms.CharField(label='Bio', max_length=100 ,widget=forms.Textarea())

просмотры.py

def settings(request):
    if request.user.is_authenticated:
        intial_data = {
        'first_name': request.user.first_name,
        'last_name': request.user.last_name,
        'user_name': request.user.username,
        'email':request.user.email,
        'bio':request.user.bio
        }
        profile_form=ProfileForm(intial_data)
        if request.method == "POST":
             profile_form=ProfileForm(request.POST, request.FILES)
             if profile_form.is_valid():
                user_name = profile_form.cleaned_data.get('user_name')
                profile_picture =request.FILES.get('profile_picture')
                bio = profile_form.cleaned_data.get('bio')
                user= User.objects.get(pk=request.user.id)
                if user is not None:
                   user.profile_picture=profile_picture
                   user.bio=bio
                   user.save()

                context ={
                "profile_form":profile_form
                }
        return render(request, 'user/settings.html',context)
     return redirect('home')

мой_шаблон.html

<tr>
 <td>Bio</td>
 <td>{{profile_form.bio}}</td>
</tr>
<tr>
 <td>Update Profile Picture</td>
 <td>{{profile_form.profile_picture}}</td>
</tr>

person iamafasha    schedule 25.11.2020    source источник
comment
В user.profile_picture=profile_picture, есть запятая в конце, вы должны удалить запятую в конце.   -  person Willem Van Onsem    schedule 25.11.2020
comment
@WillemVanOnsem все еще не работает.   -  person iamafasha    schedule 25.11.2020
comment
Поле в модели User, которое вы назвали profile_pic, а не profile_picture.   -  person Melvyn    schedule 25.11.2020


Ответы (1)


В строке стоит запятая:

#                    trailing comma ↓
user.profile_picture=profile_picture,

вам нужно удалить это.

При этом я бы посоветовал использовать ModelForm, это может удалить много стандартного кода:

class ProfileForm(forms.Form):

    class Meta:
        model = User
        fields = ['profile_pic', 'bio']
        labels = {
            'profile_pic': 'Profile picture'
        }
        widgets = {
            'bio': forms.Textarea
        }

Затем в представлении мы можем использовать:

from django.contrib.auth.decorators import login_required

@login_required
def settings(request):
    if request.method == 'POST':
         profile_form = ProfileForm(request.POST, request.FILES, instance=request.user)
         if profile_form.is_valid():
             profile_form.save()
             return redirect('home')
    else:
        profile_form = ProfileForm(instance=request.user)
    context ={
        'profile_form': profile_form
    }
    return render(request, 'user/settings.html', context)
person Willem Van Onsem    schedule 25.11.2020