django:想要一个动态改变序列数据的表格

时间:2014-12-22 11:58:36

标签: python django django-forms pyyaml

Django专家 - 我是新手,需要你的帮助以下。

假设我有一些复杂的数据结构,一个任意的例子:

(yaml格式)

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

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

...

我的目标是一个Web界面,允许创建/修改/保存和显示此类数据。我无法想象如何为这种数据定义表单和模型。问题是数据不是静态的,例如,用户可以根据需要添加任意数量的列表项目&fff。价值,即它没有固定两个项目' bar'和' foobar',可能会添加无限数量的项目。 (对于其余的测序数据也是如此)。我只知道' ff'是一个列表值。 (我想象网页视图带有一些小的" +"符号允许添加数据。)

表单填写后,我希望能够使用pyyaml将其转换为yaml并保存数据。反向加载文件中的数据并在表单中显示以允许修改。

所以用两个词来说 - 如何处理"动态的,有序的表单/模型字段"。

P.S。我在这里遇到的另一个问题是没有内置类型字段。我想为每种那种领域都有一个单独的表格,并且"参考"用外键。这是一个正确的方法吗?或者可能会定义自定义字段更好?

非常感谢提前!!

1 个答案:

答案 0 :(得分: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()

<强>更新

在表单中,您应该根据所需的数据类型创建自定义字段。最简单的方法是使用文本字段并将逗号分隔的文本转换为列表:

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 []