Создание пользовательского списка / словаря BoundFields для формы django (эмуляция form.hidden_fields) - PullRequest
0 голосов
/ 19 августа 2011

Хорошо, у меня есть несколько сложная форма с большим количеством сложной бизнес-логики, и в результате я фактически создаю поля на лету, когда форма создается.Мне нужно иметь доступ к полям в шаблоне, но, конечно, поскольку они сгенерированы, я не могу просто сделать что-то вроде {{ form.fieldname }}, потому что в этом случае fieldname на самом деле создается из переменной.

Я попробовал что-то вроде этого в форме:

def __init__(self, *args, **kwargs):
    # initialization code is here, so let's just skip that
    self.items = kwargs.pop("items", [])
    self.my_fields = []
    for item in self.items:
        self.fields['item_%d' % item.pk]=forms.CharField(required=True, label=item.name)
        self.my_fields.append(self.fields['item_%d' % item.pk])

Однако в шаблоне, когда я пытаюсь это сделать:

{% for field in self.my_fields %}
    {{ field }}
{% endfor %}

я получаю что-то вроде <django.forms.fields.CharField object at 0x2b08aeb45810>

Есть ли способ сделать это, чтобы я мог получить фактическое визуализированное поле?

Обновление

Похоже, что визуализированные поля имеют тип django.forms.forms.BoundField и создаются при вызове __getitem__на объекте field.В принципе, я думаю, мне нужен какой-то способ создать что-то, что ведет себя так, как будто hidden_fields содержит только мои поля.

1 Ответ

0 голосов
/ 20 августа 2011

Разобрался.Чтобы убедиться, что __getitem__ запущен, мне нужно было установить поля следующим образом:

def __init__(self, *args, **kwargs):
    # initialization code is here, so let's just skip that
    self.items = kwargs.pop("items", [])
    self.my_fields = []
    for item in self.items:
        self.fields['item_%d' % item.pk]=forms.CharField(required=True, label=item.name)
        self.my_fields.append(self['item_%d' % item.pk])
...