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。我在这里遇到的另一个问题是没有内置类型字段。我想为每种那种领域都有一个单独的表格,并且"参考"用外键。这是一个正确的方法吗?或者可能会定义自定义字段更好?
非常感谢提前!!
答案 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 []