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
相关产品推荐
相关产品推荐

