import json from django.forms import widgets from apps.files.models import File class CommaSeparatedTextInput(widgets.HiddenInput): def format_value(self, value): try: value = ','.join(value) except TypeError: value = '' return super().format_value(value) def value_from_datadict(self, data, files, name): value = super().value_from_datadict(data, files, name) if value == '': return None try: return value.split(',') except AttributeError: return None def idToDict(id): file = File.objects.get(pk=id) return dict(id=id, name=file.name()) # For clarity: # the canonical format is a list of integers (IDs of files) # the input/display format is a string containing a JSON list of {id=x, name=y} objects class JSONFileListWidget(widgets.HiddenInput): def format_value(self, value): try: value = [ idToDict(id) for id in value ] value = json.dumps(value) except TypeError: value = '' return super().format_value(value) def value_from_datadict(self, data, files, name): value = super().value_from_datadict(data, files, name) if value == '': return None try: filelist = json.loads(value) return [ file['id'] for file in filelist ] except JSONDecodeError: return None