Django ImageField 完整配置与图片处理指南

追风的人
追风的人
发布时间:2026-10-14| 4人浏览过
原创

本文详细解析 Django 中 ImageField 的完整使用流程,涵盖 settings 配置、Model 定义、Form 表单验证及 HTML 模板显示。重点讲解 enctype 设置、路径静态化处理、图片更新逻辑及默认图片的 HTML 层实现方案,帮助开发者解决图片存储与展示中的常见问题。

Django 中 ImageField 的使用详解

在完善订单系统的作业过程中,主要需求是为每个菜品添加图片以提升界面美观度。然而,这一看似简单的功能实现却耗费了大量时间。本文将此过程中的经验与知识点进行整理记录,旨在分享相关知识。

使用流程

1. 配置 settings 文件

需要在配置文件中定义两个关键变量:MEDIA_ROOT 用于指定上传图片在服务器上的存储根目录,而 MEDIA_URL 则定义访问这些文件时 URL 的前缀部分。


# 图片储存根路径
MEDIA_ROOT = join('media')
# 图片访问url
MEDIA_URL = '/IMG/'

2. 在 Model 中增加 ImageField 属性

必须正确配置 upload_to 参数,它决定了图片最终存储的具体子文件夹名称。例如,若设置为 'img/',则图片将保存在 MEDIA_ROOT 指向目录下的 'img' 文件夹中。


class Menu(models.Model):
  """
  餐品数据库
  """
  ID = models.BigAutoField(primary_key=True,editable=False)
  lastEditTime = models.DateTimeField(auto_now_add=True)
  merchantID = models.ForeignKey(Usr, verbose_name="商家账号", on_delete=models.CASCADE,to_field='ID')
  itemName = models.CharField(max_length=20,verbose_name="餐品名")
  itemText = models.TextField(verbose_name="餐品简介")
  price = models.FloatField(verbose_name="餐品价格")
  ################# up_load代表你上传图片所存储的文件夹名字
  picture = models.ImageField(verbose_name='餐品图片',null=True,upload_to='img/')
  class Meta:
    db_table = "Menu"
    verbose_name = "餐品数据表"
    ordering=['-lastEditTime']

3. 构建 Form 表单类

本项目采用 Django 内置的 Form 表单类来处理前端提交的数据传递与验证。


class MerchantDish(forms.Form):
  """
  商家菜品提交表单
  """
  itemName = forms.CharField(max_length=20,label="餐品名")
  itemText = forms.CharField(max_length=300,label="餐品简介")
  price = forms.FloatField(label="餐品价格")
  picture = forms.ImageField(label='餐品图片')

4. HTML 模板文件(用于新增菜品)

在编写 HTML 表单时,务必添加 enctype="multipart/form-data" 属性,这是文件上传所必需的条件。


<form action="updateDish_post/" method="post" enctype="multipart/form-data"> 
  {% csrf_token %} {{form.as_p}}
  <button type="submit">修改</button> 
  <button type="button"><a href="/MerchantSystem/DelDish/{{dishID}}/" rel="external nofollow" >删除</a></button>
</form>

5. 显示菜品的 HTML 模板文件

关键在于 img 标签中 src 属性的路径配置。这里提供两种方法,推荐使用方法一,其安全性较高,即使图片字段为空也不会导致报错(同时可调整图片显示尺寸)。

方法一:路径格式为 /IMG(自定义的 MEDIA_URL)/{{dish.picture}}。其中 dish 代表从后端传递过来的菜品对象,dish.picture 对应 Model 中定义了 ImageField 属性的字段。

方法二:使用 {{dish.picture.url}}。由于 ImageField 属于文件类,它内置了 name、path 和 url 三个属性,可直接通过 .url 访问图片链接。


{% for dish in menu %}
<!--将目录的数据展示在html中-->
<!-- 提交到一个含参数的url注意后端的接收 -->
<form action="/MerchantSystem/Dish/{{dish.ID}}/" method="post">
  {% csrf_token %}
  <li class="media">
    <div class="media-left media-middle" >
        <img class="media-object" width="150" height="150" src="/IMG/{{dish.picture}}" alt="">
    </div>
    <div class="media-body">
      <h4 class="media-heading">
        <button type='submit' class=" url" title="更新菜品信息">
        菜名:{{dish.itemName|default:"Null"}}
        </button>
        <span class="label label-default">
          价格:{{dish.price|default:"Null"}}
        </span>

      </h4>
      简介:{{dish.itemText|default:"Null"}}
    </div>
  </li>
</form>

{% empty %}

<!--若中无数据展示如下内容-->

<p>暂无数据..</p>

{% endfor %} {% endblock tableBody %}

6. 路径静态化处理

需要在项目的 urls.py 中配置静态文件处理,具体操作是将 static 函数加入 urlpatterns,确保 MEDIA_URL 指向的资源能被正确访问。


from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
  path('', views.base_view, name = "base"),# 顾客服务系统
  path('order/<int:dishID>/', views.order_view),# 订单详情
  path('order/<int:dishID>/submit/',views.order_submit),# 提交订单
  path('pay/<int:orderID>/', views.pay_view),# 缴费
  path('pay/<int:orderID>/submit/',views.pay_submit),#确认账单
  path('order/list/',views.order_list_view),#历史订单列表
  path('order/confirm/<int:orderID>/',views.order_confirm),#订单确认收到
  path('order/comment/<int:orderID>/',views.comment),#到达相应菜品的评论界面
  path('order/comment_post/<int:orderID>/',views.comment_post)#提交评论
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

7. 修改已上传的图片

首先通过 Form 表单上传图片,经过有效性检查后,将 cleaned_data 中的 picture 数据赋值给待更新对象的 picture 属性,最后调用 save() 方法保存更改。具体代码实现如下:


def updateDish_post(request,dishID):
  """
  接受修改菜品的请求
  """
  dish_form = MerchantDish(request.POST,request.FILES)
  if dish_form.is_valid() :
    dish = Menu.objects.get(ID = dishID)
    dish.itemName = dish_form.cleaned_data['itemName']
    dish.itemText = dish_form.cleaned_data['itemText']
    dish.price = dish_form.cleaned_data['price']
    dish.picture = dish_form.cleaned_data['picture']
    dish.save()
    # dishChange = dish_form.clean()    
    return redirect('/MerchantSystem/')
  elif dish_form.errors is not None:
    print(dish_form.errors)
    return HttpResponse(str(dish_form.errors))

8. 设置默认图片

查阅大量资料后,发现无法直接在 model.py 中通过 default 参数设置默认图片。经过尝试,最终通过在显示图片的 HTML 模板的 src 属性中指定默认路径来解决。具体代码逻辑为:dish 是后端传递的参数,default 指向默认图片的存储位置。


    <div class="media-left media-middle" >
        <!-- {{dish.url|default:"Null"}} -->
        <img class="media-object" width="150" height="150" src="/IMG/{{dish.picture|default:'img/default.jpg'}}" alt="">
    </div>

参考资料:

ImageField 的使用

默认图片的赋值(感觉方法不行)

到此这篇关于 Django 中 ImageField 的使用详解的文章就介绍到这了,更多相关 Django ImageField 内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。