2016-12-19 51 views
0

我有一個表格(正常工作),我想傳遞給一個formset,但林傳遞用於ChoiceFields元組不會呈現或有錯誤:表單集最初的選擇字段

這是原來的形式:

class PO_Form(forms.Form): 
    def __init__(self, baseItem_choices, color_choices, material_choices, sizeGroup_choices, *args, **kwargs): 
     super(PO_Form, self).__init__(*args, **kwargs) 
     self.fields['base_item'].choices = baseItem_choices 
     self.fields['color_or_print'].choices = color_choices 
     self.fields['material'].choices = material_choices 
     self.fields['size_group'].choices = sizeGroup_choices 

    base_item = forms.ChoiceField(choices=(), required=True) 
    color_or_print = forms.ChoiceField(choices=(), required=True) 
    material = forms.ChoiceField(choices=(), required=True) 
    size_group = forms.ChoiceField(choices=(), required=True) 

這種形式ChoiceFields從我在一個視圖中創建touples的各種列表填充:

form = PO_Form(baseItem_choices, color_choices, material_choices, sizeGroup_choices) 

如何使這項工作在一個formset?我嘗試了兩種方法: 1:

PO_FormSet = formset_factory(PO_Form(baseItem_choices, color_choices, material_choices, sizeGroup_choices), extra=2) 

我得到這個錯誤:

File "/Library/Python/2.7/site-packages/django/core/handlers/exception.py" in inner 39. response = get_response(request)

File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response 187. response = self.process_exception_by_middleware(e, request)

File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response 185. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/carlospceballos/Dropbox (Personal)/django/projectos/WholeSale/ShowRoom/views.py" in PO_formset_populate 115. PO_FormSet = formset_factory(PO_Form(baseItem_choices, color_choices, material_choices, sizeGroup_choices), extra=2)

File "/Library/Python/2.7/site-packages/django/forms/formsets.py" in formset_factory 449. return type(form.name + str('FormSet'), (formset,), attrs)

Exception Type: AttributeError at /showroom/po_populate/3/ Exception Value: 'PO_Form' object has no attribute 'name'

2:我試圖在視圖中設置初始值:

PO_FormSet = formset_factory(PO_Form(), extra=2) 
formset = PO_FormSet(initial=[ 
    { 'base_item': baseItem_choices, 
     'color_or_print': color_choices, 
     'material': material_choices, 
     'size_group': sizeGroup_choices, } 
]) 

如果我不」修改後的PO_Form出現了一個錯誤,說該表單需要5個參數,而且只有傳遞1。如果我修改表單(剝離初始化),我不會收到任何錯誤,但選擇領域是空的......我做錯了什麼?

回答

1

您正在將表單的實例而不是表單類傳遞給formset_factory方法。您可以在實例化formset之後設置選項。

forms.py:

class PO_Form(forms.Form): 
    base_item = forms.ChoiceField(choices=(), required=True) 
    color_or_print = forms.ChoiceField(choices=(), required=True) 
    material = forms.ChoiceField(choices=(), required=True) 
    size_group = forms.ChoiceField(choices=(), required=True) 

views.py:

PO_FormSet = formset_factory(PO_Form) 

formset = PO_FormSet() 

for form in formset.forms: 
    form.fields['base_item'].choices = baseItem_choices 
    form.fields['color_or_print'].choices = color_choices 
    form.fields['material'].choices = material_choices 
    form.fields['size_group'].choices = sizeGroup_choices 
+0

真棒,謝謝!它的工作現在 –