首页 > 其他分享 >django 1.8 官方文档翻译: 3-3-4 管理文件

django 1.8 官方文档翻译: 3-3-4 管理文件

时间:2023-04-13 14:34:22浏览次数:44  
标签:文件 储存 photo 管理文件 1.8 django car path Django


管理文件

这篇文档描述了Django为那些用户上传文件准备的文件访问API。底层的API足够通用,你可以使用为其它目的来使用它们。如果你想要处理静态文件(JS,CSS,以及其他),参见管理静态文件(CSS和图像)。

通常,Django使用MEDIA_ROOTMEDIA_URL设置在本地储存文件。下面的例子假设你使用这些默认值。

然而,Django提供了一些方法来编写自定义的 文件储存系统,允许你完全自定义Django在哪里以及如何储存文件。这篇文档的另一部分描述了这些储存系统如何工作。

在模型中使用文件

当你使用FileField 或者 ImageField的时候,Django为你提供了一系列的API用来处理文件。

考虑下面的模型,它使用ImageField来储存一张照片:

from django.db import models

class Car(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    photo = models.ImageField(upload_to='cars')

任何Car的实例都有一个 photo字段,你可以通过它来获取附加图片的详细信息:

>>> car = Car.objects.get(name="57 Chevy")
>>> car.photo
<ImageFieldFile: chevy.jpg>
>>> car.photo.name
'cars/chevy.jpg'
>>> car.photo.path
'/media/cars/chevy.jpg'
>>> car.photo.url
'http://media.example.com/cars/chevy.jpg'

例子中的car.photo 对象是一个File 对象,这意味着它拥有下面描述的所有方法和属性。

注意

文件保存是数据库模型保存的一部分,所以磁盘上真实的文件名在模型保存之前并不可靠。

例如,你可以通过设置文件的 name属性为一个和文件储存位置 (MEDIA_ROOT,如果你使用默认的FileSystemStorage)相关的路径,来修改文件名称。

>>> import os
>>> from django.conf import settings
>>> initial_path = car.photo.path
>>> car.photo.name = 'cars/chevy_ii.jpg'
>>> new_path = settings.MEDIA_ROOT + car.photo.name
>>> # Move the file on the filesystem
>>> os.rename(initial_path, new_path)
>>> car.save()
>>> car.photo.path
'/media/cars/chevy_ii.jpg'
>>> car.photo.path == new_path
True

File

当Django需要表示一个文件的时候,它在内部使用django.core.files.File实例。这个对象是 Python 内建文件对象的一个简单封装,并带有一些Django特定的附加功能。

大多数情况你可以简单地使用Django提供给你的File对象(例如像上面那样把文件附加到模型,或者是上传的文件)。

如果你需要自行构造一个File对象,最简单的方法是使用Python内建的file 对象来创建一个:

>>> from django.core.files import File

# Create a Python file object using open()
>>> f = open('/tmp/hello.world', 'w')
>>> myfile = File(f)

现在你可以使用 File类的任何文档中记录的属性和方法了。

注意这种方法创建的文件并不会自动关闭。以下步骤可以用于自动关闭文件:

>>> from django.core.files import File

# Create a Python file object using open() and the with statement
>>> with open('/tmp/hello.world', 'w') as f:
...     myfile = File(f)
...     myfile.write('Hello World')
...
>>> myfile.closed
True
>>> f.closed
True

在处理大量对象的循环中访问文件字段时,关闭文件极其重要。如果文件在访问之后没有手动关闭,会有消耗完文件描述符的风险。这可能导致如下错误:

IOError: [Errno 24] Too many open files

文件储存

在背后,Django需要决定在哪里以及如何将文件储存到文件系统。这是一个对象,它实际上理解一些东西,比如文件系统,打开和读取文件,以及其他。

Django的默认文件储存由DEFAULT_FILE_STORAGE设置提供。如果你没有显式提供一个储存系统,就会使用它。

关于内建的默认文件储存系统的细节,请参见下面一节。另外,关于编写你自己的文件储存系统的一些信息,请见编写自定义的文件系统。

储存对象

大多数情况你可能并不想使用File对象(它向文件提供适当的存储功能),你可以直接使用文件储存系统。你可以创建一些自定义文件储存类的实例,或者 – 大多数情况更加有用的 – 你可以使用全局的默认储存系统:

>>> from django.core.files.storage import default_storage
>>> from django.core.files.base import ContentFile

>>> path = default_storage.save('/path/to/file', ContentFile('new content'))
>>> path
'/path/to/file'

>>> default_storage.size(path)
11
>>> default_storage.open(path).read()
'new content'

>>> default_storage.delete(path)
>>> default_storage.exists(path)
False

关于文件储存API,参见 文件储存API。

内建的文件系统储存类

Django自带了django.core.files.storage.FileSystemStorage 类,它实现了基本的本地文件系统中的文件储存。

例如,下面的代码会在 /media/photos 目录下储存上传的文件,无论MEDIA_ROOT设置是什么:

from django.db import models
from django.core.files.storage import FileSystemStorage

fs = FileSystemStorage(location='/media/photos')

class Car(models.Model):
    ...
    photo = models.ImageField(storage=fs)

自定义储存系统 以相同方式工作:你可以把它们作为storage参数传递给FileField

译者:Django 文档协作翻译小组,原文:Managing files

本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。

Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。

标签:文件,储存,photo,管理文件,1.8,django,car,path,Django
From: https://blog.51cto.com/wizardforcel/6187992

相关文章

  • Django 对实体的增删改查样例
    classUserInfo(models.Model):"""人员信息"""user_id=models.CharField(max_length=20,primary_key=True,blank=False,verbose_name='人员ID')user_name=models.CharField(max_length=200,blank=Fal......
  • django 配置admin 数据管理,增加数据批量上传下载功能
    在使用django-admin带来直接管理数据库带来的便利的同时,我们希望数据能批量上传,为了达到此目的,我们需要django-admin-export 模块一、安装模块pip3installdjango-import-export-ihttps://mirrors.aliyun.com/pypi/simple/二、settings.py注册模块INSTALLED_APPS=......
  • jdk1.8 LocalDate、LocalTime、LocalDateTime
    LocalDate、LocalTime、LocalDateTime区别LocalDate使用基础使用LocalDate、LocalTime、LocalDateTime区别LocalDate、LocalTime、LocalDateTime是java8对日期、时间提供的新接口。相比于SimpleDateFormat,线程安全。LocalDate用于日期的计算LocalTime用于时刻的......
  • Django自带的Admin后台中如何获取当前登录用户
    需求背景在使用Django快速开发一个IT电脑、显示器资产管理小系统的时候,遇到一个问题是,当变更资产设备(新增、修改、删除)的时候,能记录是谁在什么时间进行的变更。确认的是肯定是登录状态,但是在使用Django的signal中获取不到当前登录的用户问题演示1、定义资产设备模型和 自定义日志......
  • 在django中自动删除超过10天的数据
    需求:比如过期10天的产品自动删除记录posting_date=models.DateTimeField(auto_now_add=True)#purge_old_data.pyfromdjango.core.management.baseimportBaseCommand,CommandErrorfromcus_leads.modelsimportCustomerLeadsfromdatetimeimportdatetime,timedel......
  • djangoadmin 过期显示红色字体
    参考:https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/#naive-and-aware-datetime-objects起因:正常的dateime.now()得到的日期不能和Django数据库里面存储的日期数据做对比,两个解决办法:1、是把Django配置里面的USE_TZ设置成False,这样Django的数据就没有时区信息了......
  • Django框架基础(1)
    一、Django的历史1、Django是什么?  Django是使用Python语言开发的一款免费而且开源的Web应用框架。  由于Python语言的跨平台性,所以Django同样支持Windows、Linux和Mac系统。  在Python语言炽手可热的当下,Django也迅速的崛起,在Web开发领域占有一席之......
  • sqlalchemy快速插入数据,scoped_session线程安全,加载类上的装饰器,基本增删改查,django中
    今日内容sqlalchemy快速插入数据sqlalchemy是什么orm框架,跟其他web框架没有必然联系,可以独立使用安装,快速使用,执行原生sql创建表和删除表不能创建数据库不能修改字段(增加,删除)使用orm插入第一步:生成engine对象engine=create_engine("mysql+pymysql://[email protected].......
  • Django配置邮件发送
    需求用户点击忘记密码后会向邮箱发送验证码,之后用户进行验证并修改密码实现步骤登录qq邮箱,点击设置,配置配置IMAP/SMTP点击开启,之后发送短信,成功发送后会看到如下内容在settings.py文件中添加如下内容#MAILEMAIL_HOST='smtp.qq.com'EMAIL_PORT=587#或465EMAIL_......
  • Django 同一Model注册多个modelAdmin
    需求:同一个djangomodel模型,根据不同需求展示注册到admin.py中classUserMsg(models.Model):username=models.CharField(max_length=20,null=False,verbose_name='发送方')hername=models.CharField(max_length=20,null=True,verbose_name='对方姓名')ti......