django-如何在模型表单中使用ImageField上传图片?

问题描述 投票:0回答:1

我的表单没有将上传的图像保存在给定的路径中,我的代码:

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))

我使用两种形式:一种用于文本,另一种用于上传图像。 但它没有上传任何东西。

有什么问题吗?

python django forms view
1个回答
0
投票

看起来您的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. 模型中的 ImageField 处理: 确保

    upload_to
    路径正确并且存在于您的项目结构中。 'static/zzz/xxx/' 路径应该相对于您的 MEDIA_ROOT。

    profile_picture = models.ImageField(blank=True, upload_to='zzz/xxx/')
    
  4. 检查 HTML 表单中的 enctype 属性: 确保您的 HTML 表单为文件上传设置了正确的

    enctype
    属性。

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

进行这些调整,应该有助于解决图像未保存的问题。

© www.soinside.com 2019 - 2024. All rights reserved.