Сохранить порядок полей в Django Modelformset - PullRequest
2 голосов
/ 11 марта 2012

Я хочу сохранить порядок полей в наборе форм, но я хочу, чтобы поле заказа было скрыто (т. Е. Пользователь не может его редактировать).

Документация здесь говоритЯ могу переопределить метод add_fields, чтобы переопределить атрибуты поля заказа.Вот мой переопределенный класс:

class MyBaseFormSet(BaseInlineFormSet):
    def add_fields(self, form, index):
        super(MyBaseFormSet, self).add_fields(form, index)
        form.fields['order'] = forms.HiddenInput()

И из views.py:

    MyFormSet = inlineformset_factory(ModelA,
                                      ModelB,
                                      formset = MyBaseFormSet,
                                      can_order = True)

Соответствующая часть моего файла шаблона:

{{ formset.management_form }}
<tr>
{% for form in formset %}
    {% for hidden in form.hidden_fields %}{{ hidden }}{% endfor %}
    <td>{% for visible in form.visible_fields %}{{ visible }}{% endfor %}</td>
</tr>

Это повышаетОшибка TemplateSyntaxError при отображении страницы: Caught AttributeError while rendering: 'HiddenInput' object has no attribute 'label' Я подозреваю, что мой переопределенный класс неверен, но документация мне не сильно помогает.

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Я немного покопался в django.forms.models и скопировал это из него.Вот как я это решил:

    form.fields['ORDER'] = forms.IntegerField(label=(u'Order'), initial=index+1, required=False)
    form.fields['ORDER'].widget = forms.HiddenInput()
2 голосов
/ 11 марта 2012

HiddenInput - это виджет , а не поле формы, поэтому попробуйте:

form.fields['order'].widget = forms.HiddenInput()
0 голосов
/ 14 марта 2017

Вы действительно можете сделать это (используя ваш пример):

MyFormSet = inlineformset_factory(
    ModelA,
    ModelB,
    formset=MyBaseFormSet,
    can_order=True,
    widgets={forms.formsets.ORDERING_FIELD_NAME: forms.HiddenInput()},
)

Однако это переопределяет любой параметр Meta.widget, содержащийся в форме, если вы используете аргумент form для inlineformset_factory. Кроме того, поле заказа добавляется позже в форму, поэтому добавление записи в поле Meta.widget для поля заказа ничего не делает. Так что, если использовать аргумент form, то, что уже было предложено здесь, кажется лучшим:

class MyBaseFormSet(BaseInlineFormSet):
    def add_fields(self, form, index):
        super(MyBaseFormSet, self).add_fields(form, index)
        try:
            form.fields[forms.formsets.ORDERING_FIELD_NAME].widget = forms.HiddenInput()
        except KeyError:
            pass
...