Custom FILE_STORAGE for Django. Saves model's filefields in your database instead of your file system.
Project description
Django DB File Storage is a custom file storage system for Django. Use it to save your models’ FileFields in your database instead of your file system.
How to use
Installing
If you still haven’t done it, install django-db-file-storage in your environment by typing the following code on your shell:
pip install django-db-file-storage
Settings
On your project’s settings, add 'db_file_storage' to your INSTALLED_APPS list.
Still on your project’s settings, set DEFAULT_FILE_STORAGE like this:
DEFAULT_FILE_STORAGE = 'db_file_storage.storage.DatabaseFileStorage'
URLs
Add the following URL pattern to your project’s main urlpatterns (/urls.py):
url(r'^files/', include('db_file_storage.urls')),
Models
For each FileField you want to save, you will need a separated model to hold the file in the database. I will refer to this extra model as the FileModel. The FileModel must have at least these fields:
a TextField() which will hold the encoded contents of the file
a CharField(max_length=255) which will hold the file’s name
a CharField(max_length=50) which will hold the file’s MIME type
For example (in a models.py file, inside an app called ‘console’):
from django.db import models class ConsolePicture(models.Model): bytes = models.TextField() filename = models.CharField(max_length=255) mimetype = models.CharField(max_length=50)
And the class which will have the FileField:
class Console(models.Model): name = models.CharField(max_length=100) picture = models.ImageField(upload_to='console.ConsolePicture/bytes/filename/mimetype', blank=True, null=True)
In this example, the FileField is actually an ImageField. It’s upload_to argument must be a string in the following format:
the FileModel’s app’s name
a dot (.)
the FileModel’s name
a forward slash (/)
the name of the FileModel’s field which will hold the encoded contents of the files
a forward slash
the name of the FileModel’s field which will hold the name of the files
a forward slash
the name of the FileModel’s field which will hold the MIME type of the files
Let’s check it again:
# 1 2 3 4 5 6 7 8 9 'console.ConsolePicture/bytes/filename/mimetype'
Don’t forget to create the necessary tables in your database, if you haven’t yet.
If you want stale files to be deleted when editing and deleting instances, override the save and delete methods of your model, calling db_file_storage.model_utils.delete_file_if_needed and db_file_storage.model_utils.delete_file inside them, respectively:
from db_file_storage.model_utils import delete_file, delete_file_if_needed from django.db import models class Console(models.Model): name = models.CharField(max_length=100, unique=True) picture = models.ImageField(upload_to='console.ConsolePicture/bytes/filename/mimetype', blank=True, null=True) def save(self, *args, **kwargs): delete_file_if_needed(self, 'picture') super(Console, self).save(*args, **kwargs) def delete(self, *args, **kwargs): super(Console, self).delete(*args, **kwargs) delete_file(self, 'picture')
Pay extra attention here to when the methods should be called. delete_file_if_needed should be called before the save method of the super class, and delete_file should be called after the delete method of the super class.
Form widget
At this point, your project already must be saving files in the database when you use Django’s ModelForms.
However, due to Django DB File Storage’s internal logic, Django’s default widget for file inputs won’t show the proper filename when downloading uploaded files. The download itself works perfectly, it’s just the widget that doesn’t show the correct name in it’s download link.
Django DB File Storage comes with a custom widget to solve this problem: DBClearableFileInput. You just need to use it when defining your form class:
from console.models import Console from db_file_storage.form_widgets import DBClearableFileInput from django import forms class ConsoleForm(forms.ModelForm): class Meta: model = Console exclude = [] widgets = { 'picture': DBClearableFileInput }
Admin Form widget
In order to solve the same problem in the Django Admin interface, Django DB File Storage comes with another custom widget: DBAdminClearableFileInput. You just need to use it when defining your form class, and then use such form when defining your ModelAdmin class inside your admin.py file:
from console.models import Console from db_file_storage.form_widgets import DBAdminClearableFileInput from django import forms from django.contrib import admin class ConsoleForm(forms.ModelForm): class Meta: model = Console exclude = [] widgets = { 'picture': DBAdminClearableFileInput } class ConsoleAdmin(admin.ModelAdmin): form = ConsoleForm
Downloading (and viewing) the files
Django DB File Storage comes with views that you can use to download the files or to just view them (for images, for example). They are accessed through the named url patterns db_file_storage.download_file and db_file_storage.get_file.
Both views must be passed a GET parameter named name, and the value of this parameter must be the value of the filefield of the instance. The template-snippet example below must make it clearer; console is an instance of the Console model defined above:
<!-- The url used to VIEW the file: --> <img src="{% url 'db_file_storage.get_file' %}?name={{ console.picture }}" /> <br/> <!-- The url used to DOWNLOAD the file: --> <a href='{% url "db_file_storage.download_file" %}?name={{ console.picture }}'> <i>Click here to download the picture</i> </a>
Demo
In order to run the demo project, just
download the project and cd into it,
cd into the demo_and_tests directory,
pip install all the libraries specified in the requirements file in your environment (you might want to create and use a virtual environment),
run python manage syncdb and python manage runserver from your shell and
visit http://localhost:8000 in your browser.
Tests & Contributing
In order to run the tests and contribute to db_file_storage, check the instructions in the CONTRIBUTING file.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file django-db-file-storage-0.2.10.tar.gz
.
File metadata
- Download URL: django-db-file-storage-0.2.10.tar.gz
- Upload date:
- Size: 20.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e1574e6de4188cb29fa5b2fd6b745a26c3b0a346525bed83905447df6bf955a7 |
|
MD5 | ba0a332e542962a03dc6176c8ebf0cf7 |
|
BLAKE2b-256 | 5bb176807f73269064e25c0b8342523a2ab4cc954d6282726e39fc453a44f4c0 |