Django - как загрузить изображение с помощью ImageField в модельную форму?
Моя форма не сохраняет загруженное изображение по указанному пути, мой код:
models.py:
class MyClass(models.Model):
user = models.OneToOneField(SomeClass, on_delete=models.CASCADE)
address_line_1 = models.CharField(blank=True, max_length=100)
address_line_2 = models.CharField(blank=True, max_length=100)
profile_picture = models.ImageField(blank=True, upload_to='static/zzz/xxx/')
forms.py
class edit_profile_form(forms.Form):
profile_picture = forms.ImageField(label='Avatar',widget=forms.FileInput(
attrs={
'class': 'form-control input_data',
'placeholder': 'Upload',}))
views.py
def validate_edit_profile(request):
template = loader.get_template('account/edit_.html')
user_form = edit_profile_form(request.POST,request.FILES)
userprofile = EcomCustomerProfile.objects.get(user_id=request.user.id)
#if user submit
if request.POST:
if user_form.is_valid():
# get the data
first_name = user_form.cleaned_data['first_name']
last_name = user_form.cleaned_data['last_name']
phone = user_form.cleaned_data['phone']
profile_picture = user_form.cleaned_data['profile_picture']
#change db
get_user = EcomCustomer.objects.get(id = request.user.id)
get_user.first_name = first_name
get_user.last_name = last_name
get_user.phone = phone
get_user.profile_picture = profile_picture
user_form.save()
get_user.save()
return HttpResponse(template.render({'userprofile':userprofile}, request))
Я использую две формы: одна для текста, другая для загрузки изображения. Но она ничего не загружает.
В чем проблема?
Похоже, что в вашем файле views.py может возникнуть проблема, когда вы пытаетесь сохранить данные формы и экземпляр пользователя. Вот несколько предложений по устранению проблемы:
Проверьте валидность формы: Убедитесь, что форма действительна, прежде чем пытаться получить доступ к очищенным данным. Используйте
is_valid()
перед попыткой доступа к очищенным данным.if user_form.is_valid(): # Your code for saving data
Обработка загрузки изображения: В вашем коде вы пытаетесь сохранить данные формы и экземпляр пользователя по отдельности. Вместо этого следует сохранять экземпляр пользователя вместе со связанной с ним картинкой профиля.
if user_form.is_valid(): get_user.first_name = first_name get_user.last_name = last_name get_user.phone = phone get_user.profile_picture = profile_picture get_user.save()
Обработка полей изображений в моделях: Убедитесь, что путь
upload_to
корректен и существует в структуре вашего проекта. Путь 'static/zzz/xxx/' должен быть относительным к вашей MEDIA_ROOT.profile_picture = models.ImageField(blank=True, upload_to='zzz/xxx/')
Проверьте атрибут enctype в вашей HTML-форме: Убедитесь, что в вашей HTML-форме установлен правильный атрибут
enctype
для загрузки файлов.<form method="post" enctype="multipart/form-data"> <!-- Your form fields here --> </form>
Выполните эти настройки, и это должно помочь решить проблему с несохранением изображения.