Comhaid a bhainistiúLink to this heading
Déanann an doiciméad seo cur síos ar APIs rochtana comhaid Django do chomhaid mar iad siúd a uaslódálann úsáideoir Tá na APIs leibhéal níos ísle ginearálta go leor gur féidir leat iad a úsáid chun críocha eile. Más mian leat “comhaid statacha” a láimhseáil (JS, CSS, srl.), Féach: doc: `/howto/static-files/index `.
De réir réamhshocraithe, stóráilíonn Django comhaid go háitiúil, ag baint úsáide as socruithe:: MEDIA_ROOT agus:setting: MEDIA_URL. Glacann na samplaí thíos leis go bhfuil na réamhshocruithe seo á úsáid agat.
Mar sin féin, soláthraíonn Django bealaí chun `córais stórála comhad `_ saincheaptha a scríobh a ligeann duit cá háit agus conas a stórálann Django comhaid a shaincheapadh go hiomlán. Déanann an dara leath den doiciméad seo cur síos ar conas a oibríonn na córais stórála
Comhaid a úsáid i samhlachaLink to this heading
Nuair a úsáideann tú a:class: ~django.db.models.filefield nó:class: ~django.db.models.imagefield, soláthraíonn Django sraith APIs is féidir leat a úsáid chun déileáil leis an gcomhad sin.
Smaoinigh ar an tsamhail seo a leanas, ag baint úsáide as an:class: ~django.db.models.imagefield chun grianghraf a stóráil:
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")
specs = models.FileField(upload_to="specs")
Beidh tréith grianghraf ``ag aon shampla ``Car is féidir leat a úsáid chun sonraí an ghrianghraf ceangailte a fháil:
>>> car = Car.objects.get(name="57 Chevy")
>>> car.photo
<ImageFieldFile: cars/chevy.jpg>
>>> car.photo.name
'cars/chevy.jpg'
>>> car.photo.path
'/media/cars/chevy.jpg'
>>> car.photo.url
'https://media.example.com/cars/chevy.jpg'
Is réad “Comhad” é an réad seo - car.photo sa sampla -- réad ``Comhad ``, rud a chiallaíonn go bhfuil na modhanna agus na tréithe go léir a thuairiscítear thíos aige.
Mar shampla, is féidir leat ainm an chomhaid a athrú tríd an comhad a shocrú 's:attr: ~django.core.files.name go cosán i gcoibhneas le suíomh stórála an chomhaid (:setting: MEDIA_ROOT má tá an réamhshocraithe:class: ~django.core.files.storage.fileSystemStorage):
>>> import os
>>> from django.conf import settings
>>> initial_path = car.photo.path
>>> car.photo.name = "cars/chevy_ii.jpg"
>>> new_path = os.path.join(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
Chun comhad atá ann cheana a shábháil ar dhiosca chuig a:class: ~Django.db.Models.FileField:
>>> from pathlib import Path
>>> from django.core.files import File
>>> path = Path("/some/external/specs.pdf")
>>> car = Car.objects.get(name="57 Chevy")
>>> with path.open(mode="rb") as f:
... car.specs = File(f, name=path.name)
... car.save()
...
An réad ``Comhad ``Link to this heading
Go hinmheánach, úsáideann Django sampla a:class: Django.core.files.file aon uair a theastaíonn uaidh comhad a léiriú.
An chuid is mó den am úsáidfidh tú ``Comhad ``a thug Django duit (ie comhad atá ceangailte le samhail mar thuas, nó comhad uaslódáilte b'fhéidir).
Más gá duit Comhad ``a thógáil duit féin, is é an bealach is éasca ceann a chruthú ag baint úsáide as réad `comhad ionsuite Python:
>>> from django.core.files import File
# Create a Python file object using open()
>>> f = open("/path/to/hello.world", "w")
>>> myfile = File(f)
Anois is féidir leat aon cheann de na tréithe agus na modhanna doiciméadaithe den aicme:class: ~django.core.files.file a úsáid.
Bí ar an eolas nach ndúntar comhaid a cruthaíodh ar an mbealach seo go huathoibr Is féidir an cur chuige seo a leanas a úsáid chun comhaid a dhúnadh go huathoibr
>>> from django.core.files import File
# Create a Python file object using open() and the with statement
>>> with open("/path/to/hello.world", "w") as f:
... myfile = File(f)
... myfile.write("Hello World")
...
>>> myfile.closed
True
>>> f.closed
True
Tá sé tábhachtach go háirithe comhaid a dhúnadh agus tú ag teacht ar réimsí comhaid i lúb thar líon mór rudaí. Mura ndúntar comhaid de láimh tar éis rochtain a fháil orthu, d'fhéadfadh an riosca go n-éireoidh amach as tuairiscí comhaid. D'fhéadfadh an earráid seo a leanas a bheith mar thoradh air seo:
OSError: [Errno 24] Too many open files
Stóráil comhadLink to this heading
Taobh thiar de na radhairc, déanann Django cinntí faoi conas agus cá háit a stóráil comhaid chuig córas stórála comhaid. Is é seo an réad a thuigeann rudaí cosúil le córais chomhaid, comhad a oscailt agus a léamh, srl.
Is é stóráil comhaid réamhshocraithe Django `:class: django.core.files.storage.filesystemStorage``. Mura soláthraíonn tú córas stórála go sainráite san eochair ``réamhshocraithe den socrú:setting: STORAGES, is é seo an ceann a úsáidfear.
Féach thíos le haghaidh sonraí faoin gcóras stórála comhaid réamhshocraithe ionsuite, agus féach: doc: /howto/custom-file-storage le haghaidh faisnéise maidir le do chóras stórála comhaid féin a scríobh.
Rudaí stórálaLink to this heading
Cé go mbeidh tú ag iarraidh réad ``Comhad ``a úsáid an chuid is mó den am (a thosclaíonn chuig an stóráil cheart don chomhad sin), is féidir leat córais stórála comhaid a úsáid go díreach. Is féidir leat sampla de rang stórála comhaid saincheaptha a chruthú, nó - is minic níos úsáideach - is féidir leat an córas stórála réamhshocraithe domhanda a úsáid:
>>> from django.core.files.base import ContentFile
>>> from django.core.files.storage import default_storage
>>> path = default_storage.save("path/to/file", ContentFile(b"new content"))
>>> path
'path/to/file'
>>> default_storage.size(path)
11
>>> default_storage.open(path).read()
b'new content'
>>> default_storage.delete(path)
>>> default_storage.exists(path)
False
Féach: doc: /ref/files/storage don API stórála comhaid.
An rang stórála córas comhaid ionsuiteLink to this heading
Seolann Django le aicme a:class: django.core.files.storage.filesystemStorage a chuireann stóráil bhunúsach comhaid chórais comhaid áitiúil i bhfeidhm.
Mar shampla, stóráilfidh an cód seo a leanas comhaid uaslódáilte faoi ``/meáin/grianghraif ``is cuma cad é do shuíomh: MEDIA_ROOT:
from django.core.files.storage import FileSystemStorage
from django.db import models
fs = FileSystemStorage(location="/media/photos")
class Car(models.Model):
...
photo = models.ImageField(storage=fs)
Custom storage systems work the same way:
you can pass them in as the storage argument to a
FileField.
Ag baint úsáide as inghlaochLink to this heading
Is féidir leat glaoch a úsáid mar an paraiméadar: attr: ~django.db.models.filefield.storage le haghaidh: class: ~django.db.models.filefield nó:class: ~django.db.models.imagefield. Ligeann sé seo duit an stóráil a úsáidtear a mhodhnú ag rith, ag roghnú stórásanna éagsúla do thimpeallachtaí éagsúla, mar shampla.
Déanfar do ghlaoch a mheas nuair a luchtar do ranganna samhlacha, agus ní mór duit sampla de:class: ~django.core.files.storage.storage a thabhairt ar ais.
Mar shampla:
from django.conf import settings
from django.db import models
from .storages import MyLocalStorage, MyRemoteStorage
def select_storage():
return MyLocalStorage() if settings.DEBUG else MyRemoteStorage()
class MyModel(models.Model):
my_file = models.FileField(storage=select_storage)
D'fhonn stóráil a shainmhínítear sa socrú: socrú: STORAGES is féidir leat úsáid:data: ~django.core.files.storage.storages:
from django.core.files.storage import storages
def select_storage():
return storages["mystorage"]
class MyModel(models.Model):
upload = models.FileField(storage=select_storage)
Because the callable is evaluated when your models classes are loaded, if you
need to override the STORAGES setting in tests, you should use a
LazyObject subclass instead:
from django.core.files.storage import storages
from django.utils.functional import LazyObject
class OtherStorage(LazyObject):
def _setup(self):
self._wrapped = storages["mystorage"]
my_storage = OtherStorage()
class MyModel(models.Model):
upload = models.FileField(storage=my_storage)
The LazyObject delays the evaluation of the storage until it's actually
needed, allowing override_settings() to take effect:
@override_settings(
STORAGES={
"mystorage": {
"BACKEND": "django.core.files.storage.InMemoryStorage",
}
}
)
def test_storage():
model = MyModel()
assert isinstance(model.upload.storage, InMemoryStorage)