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中常用检测字符串相关函数汇总
Apr 15 Python
利用python画一颗心的方法示例
Jan 31 Python
Python Nose框架编写测试用例方法
Oct 26 Python
Python实现的txt文件去重功能示例
Jul 07 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Python进阶之@property动态属性的实现
Apr 01 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
python和php哪个更适合写爬虫
Jun 22 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Python实现Hash算法
Mar 18 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动态生成VRML网页
2006/10/09 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
Web开发之JavaScript
2012/03/29 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
jquery动态添加option示例
2013/12/30 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
js尾调用优化的实现
2019/05/23 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
Python基础之函数用法实例详解
2014/09/10 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python try except else使用详解
2021/01/12 Python
python 装饰器重要在哪
2021/02/14 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
爱祖国爱家乡演讲稿
2014/09/02 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2016年春节问候语
2015/11/11 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python