Django文件类型字段FileField和ImageField

FileField

class FileField(upload_to=None, max_length=100, **options)
一个文件上传字段。

请注意
primary_key参数不受支持,如果使用它将引发一个错误。

有两个可选参数:

FileField.upload_to

这个属性提供了一种设置上传目录和文件名的方法,可以通过两种方式进行设置。在这两种情况下,值都被传递给Storage.save()方法。

字符串值

如果指定一个字符串值,它可能包含strftime()格式,该格式将被文件上传的日期/时间所取代(这样上传的文件就不会填满给定的目录)。例如:

class MyModel(models.Model):
    # file will be uploaded to MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # or...
    # file will be saved to MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

如果您使用的是默认的FileSystemStorage,则该字符串值将被附加到MEDIA_ROOT路径中,以在本地文件系统上形成存储上传文件的位置。如果您使用的是不同的存储,请检查该存储的文档,看看它是如何处理upload_to的。

函数

Upload_to也可以是一个可调用对象,比如一个函数。这将被调用以获得上载路径,包括文件名。这个可调用对象必须接受两个参数并返回一个unix风格的路径(带有斜杠),该路径将被传递给存储系统。

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)

FileField.storage

一个存储对象,用来处理文件的存储和检索。

ImageField

class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
从FileField继承所有属性和方法,但也验证上传的对象是一个有效的图像。
除了FileField可用的特殊属性外,ImageField也有高度和宽度属性。
为了方便查询这些属性,ImageField有两个额外的可选参数:

ImageField.height_field

模型字段的名称,它将在每次保存模型实例时自动填充图像的高度。

ImageField.width_field

模型字段的名称,它将在每次保存模型实例时自动填充图像的宽度。

依赖Pillow模块。

ImageField实例在数据库中创建为varchar列,默认最大长度为100个字符。与其他字段一样,可以使用max_length参数更改最大长度。

该字段的默认表单小部件是ClearableFileInput。

示例

# models.py
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')
    json_file = models.FileField(upload_to='cars')
# views.py
# File和ContentFile
from django.core.files import File
from django.core.files.base import ContentFile

...
car = Car.objects.get(name="Chevy")
f = open('chevy.jpg', 'rb')
myfile = File(f)
# save=False需要手动调用save()方法保存
car.photo.save('chevy.jpg', myfile, save=False)
car.save()
# save=True会自动调用save()方法
car.photo.save('chevy.jpg', myfile, save=True)
#
#
# ContentFile
car = Car.objects.get(name="Chevy")
json_data = json.dumps({'name': 'Chevy'}, ensure_ascii=False)
car.text_file.save('chevy.json', ContentFile(json_data))
...

文件对象属性

>>> car = Car.objects.get(name="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'
>>>

删除文件

File.delete(save=True/False)
从模型实例中删除该文件对象并删除文件。如果save为True,一旦文件被删除,模型的save()方法将被调用。

>>> car = Car.objects.get(name="Chevy")
>>> car.photo.delete(save=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值