动态django表单 - 可变字段

时间:2010-03-05 21:18:15

标签: django dynamic field

我有一些模特;词汇表(标签列表),标签(标签)和不同的文章类型。

这些文章类型启用了一些词汇,有些则没有,例如:图像可以使用A,B中的术语和带有A或C术语的新闻文章进行标记。

但这仅存在于数据库级别。

我要做的是输出字段,具体取决于是否为内容类型启用了词汇,如下所示:

  • 确定此内容类型是否与词汇表相关联。

  • 加载词汇

  • 为每个词汇输出CharField或Select。

然而,我在最后一步所做的所有努力都失败了,所以我希望有人能指出我正确的方向。


我对我正在使用的代码不太清楚表示歉意,所以这里是:

词汇 - 标签

NewsArticle可以使用词汇1,3中的标签 博客可以使用vocab 1,2中的标签

此代码获取为内容类型启用的词汇表:

    def get_vocabularies(self, type = None):
    vocabularies = {}
    object = namedtuple("Vocabulary", "vid name desc help relations hierarchy multiple req tags weight")
    if (type != None):
        vocabs = VocabularyTypes.objects.filter(type=type)
        for vocab in vocabs:
            v = Vocabulary.objects.get(pk=vocab.vid)
            vocabularies[v.vid] = object(vid = v.vid, 
                                         name = v.name, 
                                         desc = v.desc,
                                         help = v.help,
                                         relations = v.relations,
                                         hierarchy = v.hierarchy,
                                         multiple = v.multiple,
                                         req = v.req,
                                         tags = v.tags,
                                         weight = v.weight
                                       )
    else:
        vocabs = Vocabulary.objects.all()
        for v in vocabs:
            vocab = Vocabulary.objects.get(pk=v.vid)
            vocabularies[v.vid] = object(vid = vocab.vid, 
                                         name = vocab.name, 
                                         desc = vocab.desc,
                                         help = vocab.help,
                                         relations = vocab.relations,
                                         hierarchy = vocab.hierarchy,
                                         multiple = vocab.multiple,
                                         req = vocab.req,
                                         tags = vocab.tags,
                                         weight = vocab.weight
                                       )

    return vocabularies

所以我到目前为止尝试的代码是:

    def free_tags(self, type):
    vocabs = Label.objects.get_vocabularies(type)

    for vid in vocabs.keys():
        output = forms.CharField(label=vocabs[vid].name,
                                 required = vocabs[vid].req,
                                 widget = forms.TextInput(attrs={'size' : 64})
                                 )
        return output

但是,在视图中使用它时会打印出内部python标识符(对象在...等处)。

然而另一个问题是,这些字段没有名称,即它们都被称为“输出”。

所以我需要知道的是当字段数量未知时输出多个字段。

1 个答案:

答案 0 :(得分:1)

This article帮助我开始使用动态表单。

最好的方法(我认为)是这样的:你有创建表单类的函数,例如

def make_form(instance):
    fields = { 'a': forms.CharField(max_length=50),
               'b': forms.CharField(widget=forms.Textarea) }
    if some_condition:
        fields['additional'] = forms.CharField()
    return type('SomeForm', (forms.BaseForm,), { 'base_fields': fields })

您只需在字典中定义一些字段,仅在满足条件时设置某些字段(instance是您要测试条件的某个模型实例)并使用Python {{3创建一个新类功能。