Django: Почему поле изображения не работает

Добрый день,

Я тестирую некоторые вещи с Django image Fields и моделью пользователя. Суть в том, что любой пользователь может загрузить и обновить картинку профиля. Но когда я выбираю картинку и нажимаю загрузить, я получаю сообщение 'This field is required. То есть как будто я ничего не выбрал.

\\\\photo.html

<form method="POST">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Upload</button>
</form>

\\\views.py

def photo_view(request):
    try:
        profile = request.user.userimage
    except UserImage.DoesNotExist:
        profile = UserImage(user=request.user)

    if request.method == 'POST':
        form = UserImageForm(request.POST, instance=profile)
        if form.is_valid():
            form.save()
            return redirect('/dashboard/user/profile')
    else:
        form = UserImageForm(instance=profile)

    return render(request, 'photo.html', {'form': form})

\models.py

class UserImage(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL, default=None, null=True, on_delete=models.CASCADE)
    photo = models.ImageField(
        upload_to='images/', height_field=None, width_field=None, max_length=100)

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

\\\settings.py

MEDIA_ROOT =  os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Я попробовал с этим https://www.geeksforgeeks.org/imagefield-django-models/

Кто-нибудь знает решение? Или мне вообще следует использовать ImageField при работе с изображениями?

Большое спасибо! :-)

Здесь есть две проблемы: если вы загружаете файлы, вам нужно указать enctype="multipart/form-data":

form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form }}
    <button type="submit">Upload</button>
</form>

Более того, вам нужно передать в форму и request.POST, и request.FILES:

def photo_view(request):
    try:
        profile = request.user.userimage
    except UserImage.DoesNotExist:
        profile = UserImage(user=request.user)
    
    if request.method == 'POST':
        form = UserImageForm(request.POST, request.FILES, instance=profile)
        if form.is_valid():
            form.save()
            return redirect('/dashboard/user/profile')
    else:
        form = UserImageForm(instance=profile)

    return render(request, 'photo.html', {'form': form})
Вернуться на верх