【问题标题】:Dynamic django forms - Variable fields动态 django 表单 - 变量字段
【发布时间】:2011-01-24 07:16:48
【问题描述】:

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

这些文章类型启用了一些词汇,而有些则不启用,例如:图像可以用来自 A、B 的术语进行标记,而新闻文章可以用来自 A 或 C 的术语进行标记。

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

我要做的是根据是否为内容类型启用词汇来输出字段,如下所示:

  • 确定此内容类型是否连接到词汇表。

  • 加载词汇表

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

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


抱歉,我对我使用的代码不是很清楚,所以这里是:

词汇 - 标签

NewsArticle 可以使用来自 vocab 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 标识符(对象实例在 ... 等)。

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

所以我需要了解的是,当字段数未知时,如何输出多个字段。

【问题讨论】:

  • 能把目前写的代码贴出来吗?

标签: django dynamic field


【解决方案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 的 type() 函数创建一个新类。

【讨论】:

  • 谢谢,我会看看这个。底线似乎是您提供了一个表单字段字典。
  • 谢谢。我不知道我需要知道的被称为dynamic forms
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2019-05-02
  • 2017-06-06
  • 2021-12-18
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多