2014-12-22 2 views
0

Эксперты Django - я новичок и нуждаюсь в вашей помощи в следующем.django: хочу иметь форму для динамически измененных данных последовательности

Пусть у меня есть какие-то сложные структуры данных, произвольный пример:

(формат YAML)

foo: 
{ 
    ff: [ bar, foobar] 
    bb: {'some map values'} 
} 

bar: [str!! "", str!! ""] 
foobar: [str!! "", str!! ""] 

...

Моя цель представляет собой веб-интерфейс, который позволяет создавать/изменять/сохранить и отобразить такие данные. Я не могу представить, как определить форму и модель для такого рода данных. Проблема в том, что данные не являются статическими, например, пользователь может добавить столько элементов списка, сколько он хочет для значения «ff», т. Е. Не фиксируется две позиции «бар» и «foobar», может быть неограниченное количество добавлены предметы. (То же самое для остальных секвенированных данных). Я знаю только, что значение для 'ff' является значением списка. (Я представляю себе веб-представление с небольшим знаком «+», позволяющим добавлять данные.)

Как только форма заполняется, я хочу использовать pyyaml ​​для преобразования ее в yaml и сохранения данных. И наоборот - загрузите данные из файла и отобразите их в форме, чтобы разрешить изменения.

Итак, в двух словах - как бороться с «динамическими, упорядоченными полями формы/модели».

P.S. Другая проблема, которую я имею здесь, - это не встроенные типы полей. Я думаю, что для каждого такого поля и «ссылки» с помощью внешнего ключа есть отдельная форма. Это правильный путь? Или, может быть, лучше определить пользовательские поля?

Большое спасибо заранее!

ответ

0

Если вы не хотите создавать конкретные модели для ваших списков вы можете использовать django-picklefield:

from picklefield.fields import PickledObjectField 

class MyModel(models.Model): 
    my_list = PickledObjectField(default=[]) 

Затем использовать его как это:

m1 = MyModel() 
m1.my_list = [1, 2, 3] 
m1.save() 
m2 = MyModel() 
m2.my_list = ["a", "b", "c", "d"] 
m2.save() 

UPDATE

В вы должны создавать настраиваемые поля на основе типа данных, который вам нужен. Самое простое - использовать текстовое поле и преобразовать текст, разделенный запятыми, в список:

class MyModelForm(forms.ModelForm): 

    class Meta: 
     model = MyModel 

    def __init__(self, *args, **kwargs): 
     super(MyModel, self).__init__(*args, **kwargs) 
     self.fields["my_list"] = forms.CharField(initial=",".join(self.instance.my_list)) 

    def clean_my_list(self): 
     data = self.cleaned_data.get('my_list', '') 
     if data: 
      return data.split(",") # Add error check, convert to number, etc 

     return [] 
+0

Большое спасибо. Кажется, это может решить мою проблему. А как насчет полей форм? – Karlitto

+0

Я имею ввиду - как мне «привязать» форму к такой модели? – Karlitto

+0

Просмотреть мои обновления. – nima