Динамические формы Джанго - Переменные поля - PullRequest
1 голос
/ 06 марта 2010

У меня есть несколько моделей; Словари (списки тегов), Ярлыки (теги) и различные типы статей.

В этих типах статей некоторые слова включены, а некоторые нет, например: изображение может быть помечено терминами из A, B и новостная статья со терминами из A или C.

Это, однако, существует только на уровне базы данных.

То, что я пытаюсь сделать, это выводить поля в зависимости от того, включен ли Vocab для типа контента или нет, например:

  • Определите, связан ли этот тип контента со словарем.

  • Загрузить словари

  • выводит 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

Однако при использовании его в виде он выводит внутренний идентификатор питона (intance объекта в ... и т. Д.).

Другая проблема, однако, состоит в том, что эти поля не имеют имени, т.е. все они называются «выходные данные».

Так что мне нужно выяснить, как вывести число полей, когда количество полей неизвестно.

1 Ответ

1 голос
/ 06 марта 2010

Эта статья очень помогла мне начать работу с динамическими формами.

Лучший способ (я думаю) заключается в следующем: у вас есть функция, которая создает класс вашей формы, например,

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() функция.

...