serialize_according_to_widget (#472)

Co-authored-by: Сергей Юрченко <s.yurchenko@softpro.com>
This commit is contained in:
Yurchenko Sergey 2022-02-12 04:49:08 +03:00 committed by GitHub
parent 8b34b63fd0
commit fc6d41fdb3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 3 deletions

View file

@ -202,11 +202,16 @@ class ConstanceAdmin(admin.ModelAdmin):
def get_config_value(self, name, options, form, initial):
default, help_text = options[0], options[1]
field_type = None
if len(options) == 3:
field_type = options[2]
# First try to load the value from the actual backend
value = initial.get(name)
# Then if the returned value is None, get the default
if value is None:
value = getattr(config, name)
form_field = form[name]
config_value = {
'name': name,
'default': localize(default),
@ -214,12 +219,17 @@ class ConstanceAdmin(admin.ModelAdmin):
'help_text': _(help_text),
'value': localize(value),
'modified': localize(value) != localize(default),
'form_field': form[name],
'form_field': form_field,
'is_date': isinstance(default, date),
'is_datetime': isinstance(default, datetime),
'is_checkbox': isinstance(form[name].field.widget, forms.CheckboxInput),
'is_file': isinstance(form[name].field.widget, forms.FileInput),
'is_checkbox': isinstance(form_field.field.widget, forms.CheckboxInput),
'is_file': isinstance(form_field.field.widget, forms.FileInput),
}
if field_type and field_type in settings.ADDITIONAL_FIELDS:
serialized_default = form[name].field.prepare_value(default)
config_value['default'] = serialized_default
config_value['raw_default'] = serialized_default
config_value['value'] = form[name].field.prepare_value(value)
return config_value

View file

@ -0,0 +1,24 @@
import json
from django.forms import fields, widgets
class JsonField(fields.CharField):
widget = widgets.Textarea
def __init__(self, rows: int = 5, **kwargs):
self.rows = rows
super().__init__(**kwargs)
def widget_attrs(self, widget: widgets.Widget):
attrs = super().widget_attrs(widget)
attrs['rows'] = self.rows
return attrs
def to_python(self, value):
if value:
return json.loads(value)
else:
return {}
def prepare_value(self, value):
return json.dumps(value)

View file

@ -102,6 +102,7 @@ CONSTANCE_ADDITIONAL_FIELDS = {
}
],
'email': ('django.forms.fields.EmailField',),
'json_field': ['cheeseshop.fields.JsonField']
}
CONSTANCE_CONFIG = {
@ -112,6 +113,11 @@ CONSTANCE_CONFIG = {
'DATE_ESTABLISHED': (date(1972, 11, 30), "the shop's first opening"),
'MY_SELECT_KEY': ('yes', 'select yes or no', 'yes_no_null_select'),
'MULTILINE': ('Line one\nLine two', 'multiline string'),
'JSON_DATA': (
{'a': 1_000, 'b': 'test', 'max': 30_000_000},
'Some test data for json',
'json_field',
),
}
CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'