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 может возникнуть проблема, когда вы пытаетесь сохранить данные формы и экземпляр пользователя. Вот несколько предложений по устранению проблемы:

  1. Проверьте валидность формы: Убедитесь, что форма действительна, прежде чем пытаться получить доступ к очищенным данным. Используйте is_valid() перед попыткой доступа к очищенным данным.

    if user_form.is_valid():
        # Your code for saving data
    
  2. Обработка загрузки изображения: В вашем коде вы пытаетесь сохранить данные формы и экземпляр пользователя по отдельности. Вместо этого следует сохранять экземпляр пользователя вместе со связанной с ним картинкой профиля.

    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()
    
  3. Обработка полей изображений в моделях: Убедитесь, что путь upload_to корректен и существует в структуре вашего проекта. Путь 'static/zzz/xxx/' должен быть относительным к вашей MEDIA_ROOT.

    profile_picture = models.ImageField(blank=True, upload_to='zzz/xxx/')
    
  4. Проверьте атрибут enctype в вашей HTML-форме: Убедитесь, что в вашей HTML-форме установлен правильный атрибут enctype для загрузки файлов.

    <form method="post" enctype="multipart/form-data">
        <!-- Your form fields here -->
    </form>
    

Выполните эти настройки, и это должно помочь решить проблему с несохранением изображения.

Вернуться на верх