我有一些模特;词汇表(标签列表),标签(标签)和不同的文章类型。
这些文章类型启用了一些词汇,有些则没有,例如:图像可以使用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标识符(对象在...等处)。
然而另一个问题是,这些字段没有名称,即它们都被称为“输出”。
所以我需要知道的是当字段数量未知时输出多个字段。
答案 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创建一个新类功能。