Django 文件上传返回无

Posted

技术标签:

【中文标题】Django 文件上传返回无【英文标题】:Django file upload returns None 【发布时间】:2020-03-03 20:59:41 【问题描述】:

我正在尝试使用 Django 上传图像文件。我能够获取其他表单数据,但不能获取图像文件。 request.FILES 为空白。下面是我的代码。

models.py

class Module(models.Model):
    title = models.CharField(max_length = 50)
    slug = models.CharField(max_length = 50)
    description = models.TextField(max_length = 500)

Forms.py

class ModuleAddForm(forms.ModelForm):
    title = forms.CharField(max_length = 50, widget = forms.TextInput(attrs = 'class': 'form-control', 'placeholder': 'Title' ))
    description = forms.CharField(max_length = 50, widget = forms.Textarea(attrs = 'class': 'form-control', 'placeholder': 'Description' ))
    image = forms.FileField(widget=forms.ClearableFileInput(attrs='multiple': True), required=False)

    class Meta:
        model = Module
        fields = ['title', 'description', 'image']

Views.py

form = ModuleAddForm(request.POST, request.FILES or None)

if form.is_valid():
    title = form.cleaned_data['title']
    description = form.cleaned_data['description']
    image = request.FILES['image]

HTML

<form class="kt-form" method = "POST" id="kt_form userform" enctype=”multipart/form-data” >% csrf_token %
  <div class="form-group row">
    <label class="col-3 col-form-label">Title</label>
    <div class="col-9">
       form.title 
    </div>
  </div>

  <div class="form-group row">
    <label class="col-3 col-form-label">Description</label>
    <div class="col-9">
       form.description 
    </div>
  </div>

  <div class="form-group row">
    <label class="col-3 col-form-label">Image</label>
    <div class="col-9">
       form.image      
    </div>
  </div> 
  <button type="submit" class="btn btn-brand">Save</button>
</form>

当我打印 request.FILES 时,它返回空白,当我尝试使用 Key 获取它时,它返回 MultiValueDict 错误。但是当我打印 request.POST 时,图像就在那里。但是没有用,因为没有上传图片。

我正在使用另一个模型来存储这个模型(模块)的图像文件,因为它可以包含多个图像。我在其他模型和功能中实现了相同的逻辑。它在那里正常工作,但在这里不工作。

我正在使用 Django 2.2。

【问题讨论】:

你的html在哪里? 使用调试器运行并尝试在这种情况下使用 dir 列出属性,添加此行以调试 import pdb;pdb.set_trace() 和 dir(vars) 以查看属性 @NishantNawarkhede 我已经添加了 HTML 我认为你错过了action表单属性。 您正在使用 ModelForm 但您的模型中没有图像字段 【参考方案1】:

就像 Arjun 所说,您的模型中没有图像字段。您可以使用该图像为您的模型创建另一个 ModelForm,并将其与您的网页上的其他表单一起显示。

以此为例。用户表单和配置文件包含图像的配置文件表单。

Forms.py

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = get_user_model()
        fields = ['email']


class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = get_user_model()
        fields = ['image']

views.py

    if request.method == 'POST':
        user_form = UserUpdateForm(request.POST, instance=request.user)
        profile_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user)

        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, f"Your account has been updated")
            return redirect('profile')

神社

    <form method="POST" enctype="multipart/form-data">
      % csrf_token %
      <fieldset class="form-group">
        <legend class="border-bottom mb-4">Profile Info</legend>
         user_form | crispy 
         profile_form | crispy 
      </fieldset>
      <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Update</button>
      </div>
    </form>

【讨论】:

以上是关于Django 文件上传返回无的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能

解决思路:通过Zuul上传文件接口无返回值的问题

Django媒体文件URL的配置

django+nginx+uwsgi,文件浏览器不上传

Django 表单验证、clean() 和文件上传

最佳文件上传组件 —— filepond