2012-03-07 22 views
1

我使用的是內聯表單集與一些JavaScript來按下一個按鈕添加更多的形式。 其中一個視圖不斷嘗試驗證空白,動態添加的表單,並觸發「此字段是必需的」警告。我對通過extra=2創建的formset中的最初2個表單沒有任何問題,它們可以是空白而不會導致錯誤。Django的內聯表單集 - 允許使用空白動態生成的形式

OrderLineItem有一個外鍵Order

#views.py 
def my_new_form_view(request): 
    OrderFormSet = inlineformset_factory(Order, OrderLineItem, extra=2, can_delete=False, 
         formfield_callback=make_custom_datefield, form=OrderLineItemForm, 
         formset=OrderLineFormSet) 
    if request.method == 'POST': 
     form = OrderForm(request.POST) 
     order_formset = OrderFormSet(request.POST, prefix="lineitem") 
     if form.is_valid() and order_formset.is_valid(): 
      new_order = form.save() 
      new_order_formset = order_formset.save(commit=False) 
      order = Order.objects.get(pk=new_order.pk) 
      for form in order_formset.forms: 
       if form.has_changed(): 
        new_f = form.save(commit=False) 
        new_f.order = order 
        new_f.save() 
      return redirect() #go to details 
    else: 
     form = OrderForm() 
     order_formset = OrderFormSet(prefix='lineitem') 

-

#forms.py 
class OrderLineFormSet(forms.models.BaseInlineFormset): 
    def clean(self): 
     #just a clean method to look for duplicates 

class OrderLineItemForm(ModelForm): 
    #just some callbacks, widget setttings, and the Meta 

-

#html 
<!-- form stuff above this --> 
{{ order_formset.management_form }} 
{{ order_formset.non_form_errors }} 
{% for form in order_formset %} 
<div class="line_item"> 
    <p>&nbsp;</p> 
    {{ form.non_field_errrors }} 
    {% for field in form.visible_fields %} 
    <div class="field"> 
     {{ field.errors }} 
     {{ field.label_tag }} 
     {{ field }} 
    </div> 
    {% endfor %} 
    {% for hidden in form.hidden_fields %} 
    {{ hidden }} 
    {% endfor %} 
</div> 
{% endfor %} 

$('#add_more').click(function() { 
    cloneMore('div.line_item:last', 'lineitem'); 
}); 

-

#js CloneMore 
function cloneMore(selector, type) { 
    var newElement = $(selector).clone(); 
    var total = $('#id_' + type + '-TOTAL_FORMS').val(); 
    newElement.find(':input').each(function() { 
     var name = $(this).attr('name').replace('-' + (total-1) + '-','-' + total + '-'); 
     var id = 'id_' + name; 
     $(this).attr({'name': name, 'id': id}).val('').removeAttr('checked'); 
    }); 
    newElement.find('label').each(function() { 
     var newFor = $(this).attr('for').replace('-' + (total-1) + '-','-' + total + '-'); 
     $(this).attr('for', newFor); 
    }); 
    total++; 
    $('#id_' + type + '-TOTAL_FORMS').val(total); 
    $(selector).after(newElement); 
} 

我會要求增加更多的代碼,這僅僅是已經有很多混亂。

東西使用JavaScript添加形式似乎被觸發.has_changed()儘管是空白。我錯過了什麼,不允許空白表格?


解決方案在該formset

一個字段有一個默認值。當我克隆表格時,它將清除所有輸入。 Django將缺省值視爲一個更改並觸發is_changed()並驗證表單。

+0

什麼版本的Django,你運行? – 2012-03-07 20:23:55

+0

@ChrisPratt 1.3.1 – 2012-03-07 20:29:34

回答

3

檢查像螢火蟲生成的表單代碼。如果任何字段都有值,則表單將被視爲「已填寫」,因此它將嘗試對其進行驗證。即使您使用默認值隱藏了字段,也可能發生這種情況。對於被忽略的形式,它必須提交上完全空白。

+0

一切都是空白。將任何字段定義爲'default ='''會有所作爲嗎? – 2012-03-07 19:40:21

+0

不應該有所作爲。這只是說它是空的另一種方式。 – 2012-03-07 20:19:08

+0

我有一些調整,但我發現了問題。我有一個默認的字段。我的克隆表單是空白的。這導致'is_changed()'從刪除默認的...觸發。所以,我會添加一個類到字段,並更改我的JavaScript不清除該輸入。總是有新的東西...... – 2012-03-07 20:37:00

相關問題