Я хотел бы загрузить изображение профиля с помощью ajax.
Но даже если я не отправляю изображение с помощью ajax, оно не работает.
У меня есть следующий кодна моем сайте:
<form action="{% url 'update_profile_pic' %}" method="post">
{% csrf_token %}
<input name="profilePic" type="file" accept="image/*"/>
</form>
ProfilePic должен быть сохранен в модели:
class UserProfile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
primary_key=True,
)
profilePic = ProcessedImageField(
upload_to=generate_random_filename,
processors=[ResizeToFill(150, 150)],
format='JPEG',
options={'quality': 60},
)
...
В url.py указана правильная запись:
...
path('update_profile_pic/', views.UpdateProfilePic.as_view(), name='update_profile_pic'),
...
Форма выглядит следующим образом:
class ProfilePicForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('profilePic',)
И представление также должно быть правильным:
class UpdateProfilePic(View):
def post(self, request):
form = ProfilePicForm(self.request.POST, self.request.FILES)
if form.is_valid():
request.user.userprofile.profilePic = form.cleaned_data['profilePic']
request.user.userprofile.save()
return JsonResponse({
image_url : request.user.userprofile.profilePic.url
})
else:
raise Http404(form.errors)
Но я всегда получаю ошибку "profilePic Это поле обязательно для заполнения.", когда я загружаюрисунок. Эта ошибка происходит из-за повышения Http404(form.errors)
, поэтому форма недействительна.
Когда я смотрю на заголовки на вкладке сети в Google Chrome, он показывает мне это:
csrfmiddlewaretoken: sbyaJ8J7COSdC0OUYr4p8ToaarjFrIniDKLT3Lr36PVeTUlc9MEafr77exYVvkXL
profilePic: fr.cc38d01b0b77.gif
1030
1030