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实现颜色rgb和hex相互转换的函数
Mar 19 Python
Python os模块学习笔记
Jun 21 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
Python操作SQLite数据库的方法详解
Jun 16 Python
Python编程argparse入门浅析
Feb 07 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
Python计算IV值的示例讲解
Feb 28 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
利用python绘制正态分布曲线
Jan 04 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 Python
python中random模块详解
Mar 01 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
js加解密 脚本解密
2008/02/22 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
Bootstrap精简教程
2015/11/27 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
ES6的解构赋值实例详解
2019/05/06 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
python求列表交集的方法汇总
2014/11/10 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
Python 通配符删除文件的实例
2018/04/24 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
python连接mongodb密码认证实例
2018/10/16 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
电子商务专业学生职业生涯规划
2014/03/07 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
活动主持人开场白
2015/05/28 职场文书