diff --git a/constance/admin.py b/constance/admin.py index ac3f8d2..277728c 100644 --- a/constance/admin.py +++ b/constance/admin.py @@ -1,11 +1,13 @@ +from collections import OrderedDict from datetime import datetime, date, time, timedelta from decimal import Decimal -import hashlib from operator import itemgetter -from collections import OrderedDict +import hashlib +import os from django import forms, VERSION from django.apps import apps +from django.conf import settings as django_settings from django.conf.urls import url from django.contrib import admin, messages from django.contrib.admin import widgets @@ -20,9 +22,9 @@ from django.utils.formats import localize from django.utils.module_loading import import_string from django.utils.translation import ugettext_lazy as _ - from . import LazyConfig, settings + config = LazyConfig() @@ -133,6 +135,14 @@ class ConstanceForm(forms.Form): self.initial['version'] = version_hash.hexdigest() def save(self): + for file_field in self.files: + file = self.cleaned_data[file_field] + file_path = os.path.join(django_settings.MEDIA_ROOT, file.name) + with open(file_path, 'wb+') as destination: + for chunk in file.chunks(): + destination.write(chunk) + self.cleaned_data[file_field] = file.name + for name in settings.CONFIG: if getattr(config, name) != self.cleaned_data[name]: setattr(config, name, self.cleaned_data[name]) @@ -193,9 +203,9 @@ class ConstanceAdmin(admin.ModelAdmin): 'value': localize(value), 'modified': localize(value) != localize(default), 'form_field': form[name], - 'is_checkbox': isinstance( - form[name].field.widget, forms.CheckboxInput), 'is_datetime': isinstance(default, datetime), + 'is_checkbox': isinstance(form[name].field.widget, forms.CheckboxInput), + 'is_file': isinstance(form[name].field.widget, forms.FileInput), } return config_value @@ -216,7 +226,9 @@ class ConstanceAdmin(admin.ModelAdmin): form_cls = self.get_changelist_form(request) form = form_cls(initial=initial) if request.method == 'POST': - form = form_cls(data=request.POST, initial=initial) + form = form_cls( + data=request.POST, files=request.FILES, initial=initial + ) if form.is_valid(): form.save() messages.add_message( diff --git a/constance/templates/admin/constance/includes/results_list.html b/constance/templates/admin/constance/includes/results_list.html index f553f60..ef5ef1e 100644 --- a/constance/templates/admin/constance/includes/results_list.html +++ b/constance/templates/admin/constance/includes/results_list.html @@ -1,4 +1,4 @@ -{% load admin_static admin_list i18n %} +{% load admin_static admin_list static i18n %}
|
{{ item.form_field.errors }}
+ {% if item.is_file %}{% trans "Current file" %}: {{ item.value }}{% endif %}
{{ item.form_field }}
Reset to default + {% endspaceless %}">{% trans "Reset to default" %} |
{% if item.modified %}
diff --git a/docs/index.rst b/docs/index.rst
index 8d04c60..0604508 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -142,6 +142,30 @@ Note: Use later evaluated strings instead of direct classes for the field and wi
'MY_SELECT_KEY': ('yes', 'select yes or no', 'yes_no_null_select'),
}
+If you want to work with files you can use this configuration:
+
+.. code-block:: python
+
+ CONSTANCE_ADDITIONAL_FIELDS = {
+ 'image_field': ['django.forms.ImageField', {}]
+ }
+
+ CONSTANCE_CONFIG = {
+ 'LOGO_IMAGE': ('default.png', 'Company logo', 'image_field'),
+ }
+
+When used in a template you probably need to use:
+
+.. code-block:: html
+
+ {% load static %}
+
+ {% get_media_prefix as MEDIA_URL %}
+ |