You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django表单无法上传图片问题求助

Django表单图片上传失效问题解决方法

你的问题出在两个关键地方,都是文件上传的基础配置缺失:

1. 模板表单未设置文件上传编码类型

HTML表单上传文件时,必须指定enctype="multipart/form-data",否则浏览器不会把文件数据发送到后端。原模板的form标签缺少这个属性,导致图片完全没被提交。

修改后的create_post.html代码:

{% extends "base/base.html" %}

{% block content %}
<form method="POST" action="{% url 'create_post' %}" enctype="multipart/form-data">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Create Post</button>
</form>
{% endblock %}

2. 视图未传递文件数据到表单

处理POST请求时,初始化PostForm必须同时传入request.POST和request.FILES,否则表单无法读取上传的文件。原视图只传了request.POST,所以post_image字段无法获取到上传的文件。

修改后的create_post视图代码:

def create_post(request):
    if request.method == 'POST':
        # 同时传入POST和FILES数据
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            author = request.user
            title = form.cleaned_data['title']
            content = form.cleaned_data['content']
            post_image = form.cleaned_data['post_image']
            post = Post.objects.create(author=author, title=title, content=content, post_image=post_image)
            return redirect("home")

    form = PostForm()

    return render(request=request, template_name="post/create_post.html", context={"form": form})

额外优化(可选)

你可以简化视图逻辑,利用ModelForm的save()方法,避免手动提取字段:

def create_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect("home")

    form = PostForm()
    return render(request, "post/create_post.html", {"form": form})

内容的提问来源于stack exchange,提问作者Franciso Reyna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 15:03:27