Merge branch 'file-upload'

This commit is contained in:
Camilo Nova 2017-11-08 08:42:34 -05:00
commit 29f493f7c1
3 changed files with 45 additions and 8 deletions

View file

@ -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(

View file

@ -1,4 +1,4 @@
{% load admin_static admin_list i18n %}
{% load admin_static admin_list static i18n %}
<table>
<thead>
<tr>
@ -18,6 +18,7 @@
</td>
<td>
{{ item.form_field.errors }}
{% if item.is_file %}{% trans "Current file" %}: <a href="{% get_media_prefix as MEDIA_URL %}{{ MEDIA_URL }}{{ item.value }}" target="_blank">{{ item.value }}</a>{% endif %}
{{ item.form_field }}
<br>
<a href="#" class="reset-link"
@ -32,7 +33,7 @@
{% elif item.is_datetime %}{{ item.raw_default|date:"U" }}
{% else %}{{ item.default }}
{% endif %}
{% endspaceless %}">Reset to default</a>
{% endspaceless %}">{% trans "Reset to default" %}</a>
</td>
<td>
{% if item.modified %}

View file

@ -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 %}
<img src="{{ MEDIA_URL }}{{ constance.LOGO_IMAGE }}">
Images are uploaded to MEDIA_ROOT.
Ordered Fields in Django Admin
------------------------------