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 open读写文件实现脚本
Sep 06 Python
python实现人人网登录示例分享
Jan 19 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
python实现串口自动触发工作的示例
Jul 02 Python
Django和Flask框架优缺点对比
Oct 24 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
Python LMDB库的使用示例
Feb 14 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类
2006/11/25 PHP
php全排列递归算法代码
2012/10/09 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
python生成随机密码或随机字符串的方法
2015/07/03 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python sorted方法和列表使用解析
2019/11/18 Python
python小项目之五子棋游戏
2019/12/26 Python
python实现低通滤波器代码
2020/02/26 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
Python分类测试代码实例汇总
2020/07/23 Python
python实现视频压缩功能
2020/12/18 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
介绍一下write命令
2014/08/10 面试题
教师辞职报告范文
2014/01/20 职场文书
自荐信如何制作?
2014/02/21 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏