Django AJAX form widgets and model fields for multiple files/images upload with progress bar
This is currently an alpha release. Not all functionality is there, only ImageField and ImagesField have been implemented and there is not yet enough error handling.
- Drag & drop file uploading via AJAX
- Plus three other ways to add files: upload button, Django Filebrowser library, and by URL
- Uploading multiple files at once
- Upload progress bar
- Four model fields with corresponding form fields and widgets:
ImagesField,ImageField,FilesField, andFileField - Image gallery widget with drag & drop reordering
- Documents gallery widget with file type icons with drag & drop reordering
- Integrates with Django Admin, Grappelli, Django Filebrowser and Mezzanine
|
|
| File drag & drop to ImagesWidget in Django Admin | Ajax upload progress bar in ImagesWidget in Django Admin |
- Django 1.5 or later
- sorl-thumbnail
- Pillow (or PIL)
- Unix/Linux (file saving uses
os.link()) - jQuery 1.7 or later
- jQuery UI
- jQuery File Upload (included)
pip install git+git://github.com/TND/django-files-widget.git
INSTALLED_APPS = (
...,
'sorl.thumbnail',
'topnotchdev.files_widget',
...,
)
MEDIA_URL = ...
MEDIA_ROOT = ...
THUMBNAIL_DEBUG = False
(Optional) basic settings with their defaults:
FILES_WIDGET_TEMP_DIR # 'temp/files_widget/'
FILES_WIDGET_FILES_DIR # 'uploads/files_widget/'
FILES_WIDGET_JQUERY_PATH # (jQuery 1.9.1 from Google)
FILES_WIDGET_JQUERY_UI_PATH # (jQuery UI 1.10.3 from Google)
FILES_WIDGET_USE_FILEBROWSER # False
FILES_WIDGET_FILEBROWSER_JS_PATH # 'filebrowser/js/AddFileBrowser.js'
url(r'^files-widget/', include('topnotchdev.files_widget.urls')),
from topnotchdev import files_widget
class MyModel(models.Model):
image = files_widget.ImageField()
images = files_widget.ImagesField()
files_widget.can_upload_files
No extra steps are required to use the widget in your Admin site. Here are some examples of displaying files and (thumbnail) images on your site:
A list of linked thumbnails:
{% for img in my_instance.images.all %}
<a src="{{ img.url }}">
{{ img.thumbnail_tag_100x100 }}
<span class="caption">{{ img.filename }}</span>
</a>
{% endfor %}
Only the next image:
{{ my_instance.images.next.img_tag }}
The filename without extension and underscores of the next 3 (or n) images:
{% for img in my_instance.images.next_3 %}
{{ img.display_name }}
{% endfor %}
Or other attributes:
{{ my_instance.image.url }}
{{ my_instance.image.filename }}
{{ my_instance.image.local_path }} (just as an example)
{{ my_instance.image.exists }}
{{ my_instance.image.get_size }}
{{ my_instance.image.thumbnail_64x64.url }}
...
MIT
- jQuery File Upload
- Tutorial on jQuery Filedrop by Martin Angelov
- Tutorial on Django AJAX file upload by Alex Kuhl
- Answer on non-Model user permissions on Stackoverflow
(Under construction)
FILES_WIDGET_TEMP_DIRFILES_WIDGET_FILES_DIRFILES_WIDGET_JQUERY_PATHFILES_WIDGET_JQUERY_UI_PATHFILES_WIDGET_USE_FILEBROWSERFILES_WIDGET_FILEBROWSER_JS_PATHFILES_WIDGET_MAX_FILESIZE(not yet implemented)FILES_WIDGET_FILE_TYPES(not yet implemented)FILES_WIDGET_USE_TRASH(not yet implemented)FILES_WIDGET_TRASH_DIR(not yet implemented)
files_widget.FileField()(not yet implemented)files_widget.FilesField()(not yet implemented)files_widget.ImageField()files_widget.ImagesField()
max_lengthon_delete(not yet implemented)max_files(not yet implemented)max_filesize(not yet implemented)file_types(not yet implemented)
splitlines()all()count()first()last()next()next_n()has_next()as_list()(not yet implemented)as_gallery()(not yet implemented)as_carousel()(not yet implemented)
- (unicode)
settingsescapedurllocal_pathfilenamedisplay_nameextimg_tag()thumbnail()thumbnail_mxn()thumbnail_tag()thumbnail_tag_mxn()exists()get_size()get_accessed_time()get_created_time()get_modified_time()
files_widget.can_upload_filesfiles_widget.can_remove_files(not yet implemented)
form.mediafiles_widget/media.html(not yet implemented)- Manual
files_widget.signals.pre_upload(not yet implemented)files_widget.signals.post_upload(not yet implemented)files_widget.signals.pre_move(not yet implemented)files_widget.signals.post_move(not yet implemented)files_widget.signals.pre_delete(not yet implemented)files_widget.signals.post_delete(not yet implemented)
post_savepost_delete(not yet implemented)
manage.py files_widget cleanup(not yet implemented)

