Хранение динамической формы в модели - PullRequest
2 голосов
/ 25 сентября 2010

Я хочу построить систему с использованием Django, которая позволит пользователям создавать формы, хранить их и заставлять своих клиентов использовать их. Я знаю, как я могу динамически создавать формы, но я ищу хороший способ по-прежнему использовать классы форм и элегантно обрабатывать динамические формы разных пользователей.

Я думаю о сохранении информации о поле формы в виде словаря в БД. Есть ли способ в django повторно интерпретировать этот словарь обратно в объект формы? Или мне нужно написать процедуру, которая будет просто интерпретировать и создавать форму в html самостоятельно?

Если кто-то знает, куда направить меня к информации, я буду очень признателен.

1 Ответ

3 голосов
/ 25 сентября 2010

Это вопрос Python, а не вопрос Django, откуда мой тег редактировать.

Чтобы воспроизвести эквивалент, скажем:

class MyForm(forms.Form):
    foo = forms.CharField(max_length=100)

вам нужно что-то вроде:

f = type(forms.Form)('MyForm', forms.Form, d)

, где d - словарь, подобный:

d = { 'foo': forms.CharField(max_length=100) }

Конечно, в конце класс формы будет связан с именем f (вы можете использовать setattr для привязки квалифицированное имя something.MyForm для соответствующего something, но пожалуйста даже не мечтайте связать его с голым именем, которое является динамически переменным -- это также было бы кошмаром для использования такого голого имени!).

Итак, чтобы воссоздать объект класса формы во время выполнения, вам нужно сохранить:

  1. его имя MyForm
  2. диктовку с именами полей в качестве ключей и объектами полей в качестве значений

и для того, чтобы точка 2 работала, вам также необходимо сохранить для каждогополе (помимо его имени) имя типа (так что вы можете восстановить тип с помощью getattr из forms) и его именованный параметр(в качестве указания), поэтому вы можете в основном сделать

d [fieldname] = getattr (forms, fieldtypename) (** fieldparameters)

на основе строк fieldname и fieldtypenameи dict fieldparameters для каждого поля при перестройке словаря d (т. е. подготовьтесь к выполнению шага 2 приведенного выше краткого списка; -).

...