Django - 使用 POST 请求仅上传模型中的图片

Posted

技术标签:

【中文标题】Django - 使用 POST 请求仅上传模型中的图片【英文标题】:Django - upload just picture in model with a POST request 【发布时间】:2020-02-11 18:52:15 【问题描述】:

我想用 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 This field is required.”。此错误来自 raise Http404(form.errors),因此表单无效。

当我在谷歌浏览器中查看网络标签中的标题时,它会显示:

csrfmiddlewaretoken:sbyaJ8J7COSdC0OUYr4p8ToaarjFrIniDKLT3Lr36PWeTUlc9MEafr77exYVvkXL

个人资料图片:fr.cc38d01b0b77.gif

我在这里做错了什么?

【问题讨论】:

我认为,您需要在标签
中使用enctype="multipart/form-data"  Wooooow 谢谢,这就是解决方案!!! :-D 【参考方案1】:

将表格更改为:

<form action="% url 'update_profile_pic' %" method="post" enctype="multipart/form-data">
  % csrf_token %
  <input name="profilePic" type="file" accept="image/*"/>
</form>

你错过了enctype="multipart/form-data"

如果您在后端遇到任何问题,this documnet 将为您提供帮助。

【讨论】:

【参考方案2】:

multipart 是为支持文件格式而定义的。 因此,如果您不指定此模型,则该表单将不支持任何类型的文件格式。 就像您需要上传 pdf 文件、视频文件或图像文件一样,出于安全考虑,对于任何类型的文件,都需要模型表单才能知道您要上传文件。

如果您只需要数据,任何人都可以上传或尝试做一些不允许的事情

***<form action="% url 'update_profile_pic' %" method="post" enctype="multipart/form-data">***

【讨论】:

以上是关于Django - 使用 POST 请求仅上传模型中的图片的主要内容,如果未能解决你的问题,请参考以下文章

Django之AJAX文件上传

django 中的 ModelForms 是不是仅用于发布?

django之上传图片

[django学习]上传图片

Django中的JSONField即使在POST请求后仍保持为空

django基础知识之上传图片: