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

Я хочу построить представление, которое позволяет пользователю обновлять изображение своего профиля. Сейчас в моем представлении очищенные данные возвращают текущий путь к изображению профиля, который затем перезаписывает существующие изображения одно за другим. Я не совсем понимаю, в чем проблема.

Кроме того, поскольку я использую изображение по умолчанию в менеджере моделей, я хочу удалить только текущее поле изображения, если оно не является полем по умолчанию.

# View

@require_POST
def update_profile_image(request, username):
    """
    Updates the user profile
    """
    form = ImageUpdateForm(request.POST)
    if form.is_valid():
        image = form.cleaned_data['profile_image']
        print('image ' + str(image))
        user = Account.objects.get(username=request.user.username)
        user.profile_image = image
        user.save()

    return redirect('pollboard')
# Model

class Account(AbstractBaseUser):

    email = models.EmailField(verbose_name='email', max_length=60, unique=True)
    username = models.CharField(max_length=40, unique=True)
    profile_image = models.ImageField(max_length=255, upload_to=get_profile_image_filepath, null=True, blank=True, default=get_default_profile_image())

# Custom Manager

class MyAccountManager(BaseUserManager):

def get_profile_image_filepath(self, filename):
    return f'profile_image/{self.pk}/{"profile_image.png"}'


def get_default_profile_image():
    return "profile_image/Logo_large.png"
# Form

class ImageUpdateForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = ['profile_image']
# Template

<div class="profile-image-modal">
    <form method="post" action="update_profile_image/">
        {% csrf_token %}
        {{ profile_image_form }}
        <button type="submit">Save Image</button>
    </form>
</div>

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

@require_POST
def update_profile_image(request, username):
    """
    Updates the user profile
    """
    #               pass request.FILES as well ↓
    form = ImageUpdateForm(request.POST, request.FILES)
    if form.is_valid():
        image = form.cleaned_data['profile_image']
        print('image ' + str(image))
        user = Account.objects.get(username=request.user.username)
        user.profile_image = image
        user.save()

    return redirect('pollboard')

кроме того, вы должны установить encytpe=… [dev-mozilla] формы в multipart/form-data для кодирования файла:

<form method="post" enctype="multipart/form-data" action="update_profile_image/">
        {% csrf_token %}
        {{ profile_image_form }}
        <button type="submit">Save Image</button>
    </form>
Вернуться на верх