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使用xmlrpc实例讲解
Dec 17 Python
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
Python中如何获取类属性的列表
Dec 26 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
Python 转换文本编码实现解析
Aug 27 Python
pygame实现五子棋游戏
Oct 29 Python
如何在 Django 模板中输出 &quot;{{&quot;
Jan 24 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
python中slice参数过长的处理方法及实例
Dec 15 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和ACCESS写聊天室(九)
2006/10/09 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
Python实现分数序列求和
2020/02/25 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
中秋节感想
2015/08/10 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
Python 发送SMTP邮件的简单教程
2021/06/24 Python
MySQL系列之六 用户与授权
2021/07/02 MySQL