2010-03-05 26 views
1

我有一些模型;词汇表(标签列表),标签(标签)和不同的文章类型。动态django表格 - 变量字段

这些文章类型使得一些vocabs,有的没有,如:图像可以用标记从A,B条款并从A或C.

方面的新闻文章然而,这只是存在于数据库水平。

我想要做的是输出字段取决于如果翻译是为内容类型启用与否,就像这样:

  • 确定此内容类型连接到一个词汇。

  • 装入词汇

  • 输出一个CharField或选择每个词汇。

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


我不被有关我使用的代码非常明确的道歉,所以在这里它是:

词汇 - 标签

NewsArticle可以使用标签从词汇1,3 博客可以使用词汇表中的标记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 

然而,在视图中使用时它打印出内部蟒标识符(在对象intance ...等)。

然而,另一个问题是,这些领域没有名字,即他们都被称为'输出'。

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

+2

你可以发布你写的代码到目前为止吗? – Zach

回答

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()功能的新类。

+0

谢谢,我会看看这个。底线似乎是你提供了一个表单字段的字典。 –

+0

谢谢你。我不知道我需要知道什么叫做“动态表单” – Sevenearths