2012-03-11 3 views
2

formset에 필드의 순서를 저장하고 싶지만 주문 필드를 숨김 (예 : 사용자가 편집 할 수 없도록)하고 싶습니다.Django Modelformset의 필드 순서를 저장하십시오.

설명서 here에 따르면 add_fields 메서드를 재정 의하여 주문 필드의 특성을 다시 정의 할 수 있습니다. 여기 내 오버라이드 (override) 클래스 :

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' 오버라이드 된 클래스가 올바르지 않다고 생각하지만 설명서가 도움이되지 않습니다.

답변

2

나는 django.forms.models의 뒷조사를했고, 그것의이 복사됩니다. (귀하의 예제를 사용하여)

form.fields['ORDER'] = forms.IntegerField(label=(u'Order'), initial=index+1, required=False) 
    form.fields['ORDER'].widget = forms.HiddenInput() 
2

HiddenInput is a widget 아닌 양식 필드, 그래서 시도 :

form.fields['order'].widget = forms.HiddenInput() 
+0

을, 나는 [ '순서'] [ 'ORDER']로 변경했고,이 페이지에 렌더링 바르게. 그러나, 내 form.cleaned_data에서 ORDER는 None입니다. 페이지에서 실제 숫자를 어떻게 얻습니까? –

+0

더 나은 점은''주문 ''을'forms.formsets.ORDERING_FIELD_NAME' (으)로 변경하십시오. –

0

당신은 실제로이 작업을 수행 할 수 있습니다 :

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

이 당신에게 form 인수를 사용하는 경우 양식에 포함 된 모든 Meta.widget 설정을 무시 이것은 내가 그것을 해결하는 방법입니다 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