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

Django上传图片无法显示求助:仅能加载静态文件夹图片

Django上传图片无法加载问题排查与解决

已通过Django视图和模板完成图片上传,但无法展示media文件夹中的图片,仅能显示static文件夹内的图片,尝试官方文档及各类方案后仍未解决,相关代码如下:

模型代码

class Product(models.Model):
    image = models.ImageField(upload_to='product_images/')
    description = models.TextField(null=True)
    quantity = models.IntegerField(null=True)

表单代码

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['image', 'description', 'quantity']

视图代码

@login_required
def display_products(request):
    products = Product.objects.all()
    return render(request, 'farmer/display_products.html', {'products': products})

@login_required
def upload(request):
    if request.method == "GET":
        form = ProductForm()
    if request.method == 'POST':
        form = ProductForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('display_products')
    return render(request, 'farmer/my_products.html', {'form': form})

模板代码

{% load static %}
{% for product in products %}

    <div class="">
        <h2>{{ product.name }}</h2>
        {{product.image.url}}
        image: <img src='{{product.image.url}}' alt="sample">
        <p>description: {{ product.description }}
        quantity: {{ product.quantity }}
        </p>
    </div>

settings.py配置

STATIC_URL = 'static/'
STATICFILES_DIRS = [
    BASE_DIR / 'static/css',
]
LOGIN_URL = 'login'


MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
DEBUG = True

urls.py配置

if settings.DEBUG:
    urlpatterns = [
        path('login/', views_auth.sign_in, name='login'),
        path('logout/', views_auth.sign_out, name='logout'),
        path('register/', views_auth.sign_up, name='register'),
        path('display_products/', views_farmer.display_products, name='display_products'),
        path('upload/', views_farmer.upload, name='upload'),
    ]
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

排查与解决步骤

  • 检查media目录权限与结构
    确认项目根目录下存在media/product_images/文件夹,本地开发时手动创建后设置权限为755,确保服务器进程有读写权限。
  • 修正URL路由写法
    当前代码在if settings.DEBUG:块内重新定义urlpatterns,虽本地DEBUG模式下可用,但更稳妥的写法是先定义基础路由,再追加media路由:
    urlpatterns = [
        path('login/', views_auth.sign_in, name='login'),
        path('logout/', views_auth.sign_out, name='logout'),
        path('register/', views_auth.sign_up, name='register'),
        path('display_products/', views_farmer.display_products, name='display_products'),
        path('upload/', views_farmer.upload, name='upload'),
    ]
    
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
  • 验证模板中URL输出
    查看模板中{{product.image.url}}的实际输出,确认路径为/media/product_images/xxx.jpg格式,若路径错误,检查MEDIA_URL与MEDIA_ROOT的配置是否匹配。
  • 确认文件接收状态
    在视图的form.is_valid()后添加打印语句print(form.cleaned_data['image']),确认表单是否正确接收上传的文件。
  • 区分静态文件与媒体文件加载
    media文件无需使用{% load static %}标签,直接通过{{product.image.url}}调用即可。
  • DEBUG模式与生产环境适配
    本地开发依赖DEBUG=True由Django提供media文件服务,若切换到生产环境(DEBUG=False),需配置Nginx等服务器处理media资源的静态请求。

内容的提问来源于stack exchange,提问作者ar d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:51:23