django中ImageField的使用详解


Posted in Python onDecember 21, 2020

ImageField的使用笔记

今天完善作业写的订单系统,主要是给每一个菜品增加图片,看起来美观一些,但是没想到这个小小的需求花了我一天时间,记录下来,算增长知识了。

使用流程

1.配置setting文件

MEDIA_ROOT代表的是上传图片的根目录,MEDIA_URL代表的是访问文件时url的前缀。

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

2.model里面增加ImageField属性

up_load一定要配置,代表你最后的图片会存储到MEDIA_ROOT/up_load(实际上是你赋予的名称)这个文件夹中。

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模板文件(增加菜品)

注意一定要添加: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模板文件

重要的是src中路径的配置,有两种方法,建议法一,自己感觉比较安全,就算没有picture时也不会报错。(注意:可调整图片显示大小)

法一:/IMG(你自己定义的MEDIA_URL)/{{dish.picture}} ----dish代表后端传来的菜品,dish.picture代表你使用的这个类中的那个有ImageField属性的字段;

法二:{{dish.picture.url}} 因为ImageField是文件类,里面有三个属性name、path、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.路径静态化

在所有的url中都要配置如下:urlpatterns + static…

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处写一个default,代码如下:
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 相关文章推荐
Python通过websocket与js客户端通信示例分析
Jun 25 Python
python自动化测试实例解析
Sep 28 Python
Python 类的特殊成员解析
Jun 20 Python
python flask框架实现传数据到js的方法分析
Jun 11 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
python实现简单银行管理系统
Oct 25 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
python 读取、写入txt文件的示例
Sep 27 Python
Python编程中内置的NotImplemented类型的用法
Mar 23 Python
python文件路径操作方法总结
Dec 21 #Python
Python爬虫新手入门之初学lxml库
Dec 20 #Python
Python修改DBF文件指定列
Dec 19 #Python
Python实现FTP文件定时自动下载的步骤
Dec 19 #Python
Python+Xlwings 删除Excel的行和列
Dec 19 #Python
python Zmail模块简介与使用示例
Dec 19 #Python
python中实现栈的三种方法
Dec 19 #Python
You might like
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
php查询ip所在地的方法
2014/12/05 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python实现爬取逐浪小说的方法
2015/07/07 Python
Python实现批量修改文件名实例
2015/07/08 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
详解Django的CSRF认证实现
2018/10/09 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
python利用faker库批量生成测试数据
2020/10/15 Python
旅游管理实习自我鉴定
2013/09/29 职场文书
周鸿祎:教你写创业计划书
2013/12/30 职场文书
应急处置方案
2014/06/16 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
领导干部作风建设总结
2014/10/23 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
学校财务管理制度
2015/08/04 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
vue 自定义组件添加原生事件
2022/04/21 Vue.js
nginx配置指令之server_name的具体使用
2022/08/14 Servers