我使用的是內聯表單集與一些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> </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()
並驗證表單。
什麼版本的Django,你運行? – 2012-03-07 20:23:55
@ChrisPratt 1.3.1 – 2012-03-07 20:29:34