Использование Django формы FileField с пользовательским файлом - PullRequest
0 голосов
/ 12 марта 2020

Я создаю конструктор форм для своего проекта. Он строит формы динамически в соответствии с полями, указанными в базе данных. Есть 3 таблицы: форма, поля формы и значения полей формы. Теперь я пытаюсь привязать данные из значений формы к полям формы. Он работает хорошо, например, так:

if (field.field_type == 'long_text'):
                new_field = forms.CharField(label=field.label, initial = value, required=False, widget=forms.Textarea(attrs={'class': 'form-control'}))

Но это не работает для FileField:

new_field = forms.FileField(label=field.label, required = False, initial = initialData)

Насколько я понимаю, «исходные» данные должны быть в определенный формат: это должен быть объект с атрибутами url и name

Вот что я делаю:

try:
    ''' data is stored in JSON {url:'', name:''} format '''
    valueData = json.loads(value)
    initialData.initial = valueData['name']
    initialData.url = valueData['url']
    initialData.name = valueData['url']                        
except:
    pass

new_field = forms.FileField(label=field.label, required = False, initial = initialData)

Форма все еще пуста. Нет флажка «очистить», нет URL для щелчка и «файл не выбран».

Что можно сделать, чтобы этот файл работал? Нужно ли имитировать файловое поле модели?

1 Ответ

0 голосов
/ 13 марта 2020

Есть похожий вопрос с немного запутанным ответом: Django - начальное значение forms.FileField ()

Так что просто для того, чтобы другим людям было проще решить подобную проблему, наконец, я пришел к следующему решению:

class DummyFile:
    def __init__(self, url, name):
        self.url = url; self.name = name
    def __str__(self):
        return self.name

(...)

valueData = json.loads(value)
initialData = DummyFile("%s%s" % (settings.MEDIA_URL,valueData['url']), valueData['name'])
new_field = forms.FileField(label=field.label, required = False, initial = initialData)

Таким образом, он в основном создает новый класс, который имеет значение .url, которое возвращает путь к фактическому файл, а также __str__, который преобразует объект в строку имени файла. Я использую URL и имя отдельно, потому что имена файлов хешируются при сохранении на сервере, а затем база данных хранит реальное имя файла.

...