# django-upload-to
![PyPI - License](https://img.shields.io/pypi/l/django-upload-to)
![Pypi Version](https://img.shields.io/pypi/v/django-upload-to.svg)
[![Codecov](https://codecov.io/github/valbertovc/django-upload-to/branch/main/graph/badge.svg?token=2R5S5GTS0X)](https://codecov.io/github/valbertovc/django-upload-to)
![Building](https://img.shields.io/github/actions/workflow/status/valbertovc/django-upload-to/release.yml)
![Python Versions](https://img.shields.io/pypi/pyversions/django-upload-to.svg)
![Django Versions](https://img.shields.io/pypi/frameworkversions/django/django-upload-to)
It generates dynamically a directory path and a secure file name for Django FileField.
Main options:
- Ready to use generators.
- Generate secure file name without especial characters.
- Generate file name using a uuid value.
- Dynamically generate paths from the model instance.
- Generate paths using Python datetime formats.
## Get started
Install the django-upload-to in your virtual environment
```bash
$ pip install django-upload-to
```
Import it in your models file and add it as a `upload_to` argument in the `FileField`
```python
# my_app/models.py
from upload_to import UploadTo
from django.db import models
class MyModel(models.Model):
attachment = models.FileField(upload_to=UploadTo("attachments"))
```
The path and file name generated will be like this:
```text
"attachments/the-file-name-uploaded.pdf"
```
## How to use the ready-to-use classes
Consider the scenario below:
```python
import upload_to
from django.db import models
class MyUser(models.Model):
username = models.CharField(...)
avatar = models.FileField(upload_to=<generator>)
instance = MyUser(username='user@email.com')
```
Replace the `<generator>` fragment by the generators as showed below:
#### File in root folder
```python
>>> generator = upload_to.UploadTo()
>>> generator(instance, "file.pdf")
"file.pdf"
```
#### Define a folder structure
```python
>>> generator = upload_to.UploadTo(prefix=["files", "documents"])
>>> generator(instance, "file.pdf")
"files/documents/file.pdf"
```
#### Generate a folder name using datetime formats from Python
```python
>>> generator = upload_to.UploadTo(prefix=["pictures", "%Y"])
>>> generator(instance, "file.png")
"pictures/2023/file.png"
```
#### Replace the file name by an hexadecimal uuid value
```python
# 4. replace file name by a uuid value
>>> generator = upload_to.UuidUploadTo()
>>> generator(instance, "file.pdf")
"b189dfdf25e640b2ba5c497472c20962.pdf"
```
#### Generate the folder path using the instance's attributes
```python
>>> generator = upload_to.AttrUploadTo(attrs=["username"])
>>> generator(instance, "file.pdf")
"useremailcom/file.pdf"
```
#### Generate the folder path using the app_label and the model_name from the instance's meta options
```python
>>> generator = upload_to.ModelUploadTo()
>>> generator(instance, "file.pdf")
"my_app/user/file.pdf"
```
## Customize your upload paths
```python
# my_app/models.py
import upload_to
from django.db import models
def my_upload_generator(instance, filename):
filename = upload_to.uuid_filename(filename)
path = upload_to.options_from_instance(instance)
return upload_to.upload_to(path, filename)
class MyProfile(models.Model):
user = models.OneToOneField(...)
avatar = models.FileField(upload_to=my_upload_generator)
```
## Useful links
1. [Documentation](https://valbertovc.github.io/django-upload-to/)
2. [Changelog](https://github.com/valbertovc/django-upload-to/releases)
3. [PyPi Page](https://pypi.org/project/django-upload-to/)
Raw data
{
"_id": null,
"home_page": "https://github.com/valbertovc/django-upload-to",
"name": "django-upload-to",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8,<4",
"maintainer_email": "",
"keywords": "django,file,media,upload",
"author": "Valberto Carneiro",
"author_email": "valbertovc@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/5d/03/8199eed31163981529de920479e4bb1c6c71d786b1e484acd3c8ae24b4f6/django_upload_to-0.3.5.tar.gz",
"platform": null,
"description": "# django-upload-to\n\n![PyPI - License](https://img.shields.io/pypi/l/django-upload-to)\n![Pypi Version](https://img.shields.io/pypi/v/django-upload-to.svg)\n[![Codecov](https://codecov.io/github/valbertovc/django-upload-to/branch/main/graph/badge.svg?token=2R5S5GTS0X)](https://codecov.io/github/valbertovc/django-upload-to)\n![Building](https://img.shields.io/github/actions/workflow/status/valbertovc/django-upload-to/release.yml)\n![Python Versions](https://img.shields.io/pypi/pyversions/django-upload-to.svg)\n![Django Versions](https://img.shields.io/pypi/frameworkversions/django/django-upload-to)\n\nIt generates dynamically a directory path and a secure file name for Django FileField.\n\nMain options:\n- Ready to use generators.\n- Generate secure file name without especial characters.\n- Generate file name using a uuid value.\n- Dynamically generate paths from the model instance.\n- Generate paths using Python datetime formats.\n\n## Get started\nInstall the django-upload-to in your virtual environment\n```bash\n$ pip install django-upload-to\n```\nImport it in your models file and add it as a `upload_to` argument in the `FileField` \n```python\n# my_app/models.py\nfrom upload_to import UploadTo\nfrom django.db import models\n\n\nclass MyModel(models.Model):\n attachment = models.FileField(upload_to=UploadTo(\"attachments\"))\n```\nThe path and file name generated will be like this:\n```text\n\"attachments/the-file-name-uploaded.pdf\"\n```\n\n## How to use the ready-to-use classes\n\nConsider the scenario below:\n```python\nimport upload_to\nfrom django.db import models\n\n\nclass MyUser(models.Model):\n username = models.CharField(...)\n avatar = models.FileField(upload_to=<generator>)\n\ninstance = MyUser(username='user@email.com')\n```\nReplace the `<generator>` fragment by the generators as showed below:\n#### File in root folder\n```python\n>>> generator = upload_to.UploadTo()\n>>> generator(instance, \"file.pdf\")\n\"file.pdf\"\n\n```\n#### Define a folder structure\n```python\n>>> generator = upload_to.UploadTo(prefix=[\"files\", \"documents\"])\n>>> generator(instance, \"file.pdf\")\n\"files/documents/file.pdf\"\n```\n#### Generate a folder name using datetime formats from Python\n```python\n>>> generator = upload_to.UploadTo(prefix=[\"pictures\", \"%Y\"])\n>>> generator(instance, \"file.png\")\n\"pictures/2023/file.png\"\n```\n#### Replace the file name by an hexadecimal uuid value\n```python\n# 4. replace file name by a uuid value\n>>> generator = upload_to.UuidUploadTo()\n>>> generator(instance, \"file.pdf\")\n\"b189dfdf25e640b2ba5c497472c20962.pdf\"\n```\n#### Generate the folder path using the instance's attributes\n```python\n>>> generator = upload_to.AttrUploadTo(attrs=[\"username\"])\n>>> generator(instance, \"file.pdf\")\n\"useremailcom/file.pdf\"\n```\n#### Generate the folder path using the app_label and the model_name from the instance's meta options\n```python\n>>> generator = upload_to.ModelUploadTo()\n>>> generator(instance, \"file.pdf\")\n\"my_app/user/file.pdf\"\n```\n\n## Customize your upload paths\n\n```python\n# my_app/models.py\nimport upload_to\nfrom django.db import models\n\n\ndef my_upload_generator(instance, filename):\n filename = upload_to.uuid_filename(filename)\n path = upload_to.options_from_instance(instance)\n return upload_to.upload_to(path, filename)\n\nclass MyProfile(models.Model):\n user = models.OneToOneField(...)\n avatar = models.FileField(upload_to=my_upload_generator)\n```\n\n## Useful links\n\n1. [Documentation](https://valbertovc.github.io/django-upload-to/)\n2. [Changelog](https://github.com/valbertovc/django-upload-to/releases)\n3. [PyPi Page](https://pypi.org/project/django-upload-to/)",
"bugtrack_url": null,
"license": "",
"summary": "It generates dynamically a directory path and a file name for Django FileField",
"version": "0.3.5",
"project_urls": {
"Bug Tracker": "https://github.com/valbertovc/django-upload-to/issues",
"Changelog": "https://github.com/valbertovc/django-upload-to/releases",
"Homepage": "https://valbertovc.github.io/django-upload-to/",
"Repository": "https://github.com/valbertovc/django-upload-to"
},
"split_keywords": [
"django",
"file",
"media",
"upload"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7994e34d3538fceece3e08791fc3ef519d208f1df86231e58cf6e88436594a09",
"md5": "71f21dab41f8e5c24bd7f68bfad74e92",
"sha256": "f9ae2774acb6eb8ce4f31370f747da98ceb17b291dcef7d2441d0b1397422a0f"
},
"downloads": -1,
"filename": "django_upload_to-0.3.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "71f21dab41f8e5c24bd7f68bfad74e92",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<4",
"size": 5508,
"upload_time": "2024-01-14T00:07:56",
"upload_time_iso_8601": "2024-01-14T00:07:56.306604Z",
"url": "https://files.pythonhosted.org/packages/79/94/e34d3538fceece3e08791fc3ef519d208f1df86231e58cf6e88436594a09/django_upload_to-0.3.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5d038199eed31163981529de920479e4bb1c6c71d786b1e484acd3c8ae24b4f6",
"md5": "6b1cbdc7b2e41bb988075962cfb0d4d7",
"sha256": "201187af493b063b24ed4ddc60153becad75f0f172e22dbd0f7ceb2ada7ff37c"
},
"downloads": -1,
"filename": "django_upload_to-0.3.5.tar.gz",
"has_sig": false,
"md5_digest": "6b1cbdc7b2e41bb988075962cfb0d4d7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<4",
"size": 4501,
"upload_time": "2024-01-14T00:07:57",
"upload_time_iso_8601": "2024-01-14T00:07:57.914748Z",
"url": "https://files.pythonhosted.org/packages/5d/03/8199eed31163981529de920479e4bb1c6c71d786b1e484acd3c8ae24b4f6/django_upload_to-0.3.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-14 00:07:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "valbertovc",
"github_project": "django-upload-to",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "django-upload-to"
}