Оберните каждую форму в набор форм с помощью div, включая неупомянутые поля с хрустящими формами django.

Я использую следующий код, чтобы объединить все поля формы формы в наборе форм вместе в div с хрустящими формами django:

class OperatorForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(OperatorForm, self).__init__(*args, **kwargs):
            self.helper = FormHelper(self)
            self.helper.form_tag = False
            self.helper.all().wrap_together(Div, css_class="operator-form")
            self.helper.render_unmentioned_fields = True

    class Meta:
        model = Operator
        fields = tuple(fields_list)

Создание экземпляра FormHelper с 'self' автоматически генерирует макет без необходимости указывать все поля. Мне это нужно, потому что мои поля генерируются динамически. Проблема в том, что в макет не добавляются поля DELETE и ORDER. Поэтому я установил для render_un упомянутых_полей значение True. С этой настройкой эти два поля, по крайней мере, отображаются в форме, но не обертываются остальными полями в div.

Я знаю, что могу вручную перебирать формы в наборе форм и обертывать их с помощью div, что я и делал до сих пор, но это требует ручной обработки неформальных ошибок набора форм, что обычно делается автоматически по хрустящему.

EDIT: код обновлен в соответствии с запросом. Весь этот класс на самом деле обернут фабричным методом, который заполняет fields_list, так что я могу динамически включать только определенные поля. ORDER и DELETE опущены намеренно. Они автоматически обнаруживаются (включение их приводит к ошибке) и отображаются в форме, просто они не завернуты в div.


person Daniel Palm    schedule 29.06.2013    source источник
comment
Разместите весь код в определении класса формы, пожалуйста.   -  person Brian Dant    schedule 30.06.2013
comment
Вы намеренно пропускаете поля DELETE и ORDER?   -  person Brian Dant    schedule 30.06.2013
comment
Обновлено по запросу. @БрайанДант   -  person Daniel Palm    schedule 01.07.2013
comment
Переместите self.helper.render_unmentioned_fields = True над предыдущей строкой и посмотрите, что получится.   -  person Brian Dant    schedule 02.07.2013
comment
Не работает. render_unmember_fields — это просто флаг. К моменту его установки макет уже заполнен. Методы all() и wrap_together вообще не оценивают его. Поэтому я ожидаю, что это отсутствующая функция/ошибка в хрустящих формах, а не то, что можно легко обойти.   -  person Daniel Palm    schedule 02.07.2013
comment
Это может быть побочный момент, который не помогает: я не вижу необходимости передавать self в FormHelper. В основном разделе документации они создают экземпляр FormHelper без передачи self и получают весь макет. Вы должны колебаться, предполагая, что Crispy не хватает какой-либо функции, или это ошибка, поскольку это одна из проблем, которую он призван решить. Вы изучали обновление макетов на ходу в Ваше мнение?   -  person Brian Dant    schedule 02.07.2013
comment
Вы не получите объект макета, если не передадите self в FormHelper. Вы заметите в документах (ваша первая ссылка), что они создают макет вручную, когда они создают экземпляр без self. Мне придется попробовать обновить на ходу, спасибо за предложение, но если вам не разрешено добавлять DELETE и ORDER вручную, я не думаю, что делать это на ходу будет чем-то другим. Если, конечно, вы не можете добавить их, когда не создаете экземпляр с собой. В любом случае, я бы подумал, что то, что работает без self, должно работать и с self.   -  person Daniel Palm    schedule 02.07.2013
comment
Причина, по которой мои поля DELETE и ORDER не завернуты, можно проследить до метода render_layout в helper.py хрустящих форм. Макет рендерится полностью (вместе с врапами и всем остальным) и только после этого рендерятся не упомянутые поля.   -  person Daniel Palm    schedule 02.07.2013


Ответы (1)


Как предложил Брайан Дант, ORDER и DELETE следует добавлять вручную, если они должны быть включены в файл Layout. Моя проблема заключалась в том, что я также передал их в «поля» класса Meta.

class _OperatorForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(_OperatorForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_tag = False
        self.helper.layout.extend(['ORDER', 'DELETE'])
        self.helper.all().wrap_together(Div, css_class="operator-form")

    class Meta:
        model = ApplicationOperator
        fields = tuple(fields_list)
person Daniel Palm    schedule 02.07.2013