Почему 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>