我有一个Formset,允许上传多个带有描述的图像:
def bilddokumentation_form(request, auftrag):
auftrag = Auftrag.objects.get(id=auftrag)
BilddokumentationFormSet = formset_factory(BilddokumentationForm, extra=1)
formset = BilddokumentationFormSet(request.POST or None, request.FILES or None)
if formset.is_valid():
for form in formset.cleaned_data:
name = form['name']
bild = form['bild']
Bilddokumentation.objects.create(
name=name,
bild=bild,
auftrag=auftrag,
user=request.META['USER'],
)
else:
print(formset.errors)
return render(request, 'auftragsverwaltung/bilddokumentation_add.html', {'item_forms': formset, 'auftrag': auftrag})
但只保存第一张表格。第二种形式不会出现在cleaned_data
。
这是模板:
<script type="text/html" id="item-template">
<div id="item-__prefix__">
{{ item_forms.empty_form }}
</div>
</script>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ item_forms.management_form }}
<div id="items-form-container">
{% for item_form in item_forms %}
<div id="item-{{ forloop.counter0 }}">
{{ item_form.id }}
{{ item_form.as_p }}
</div>
{% endfor %}
</div>
<a href="#" id="add-item-button" class="btn btn-info add-item">weiteres Bild hinzufügen</a>
<input type="submit" class="btn btn-primary" value="Bilder hinzufügen">
</form>
<script>
$(document).ready(function() {
$('.add-item').click(function(ev) {
ev.preventDefault();
var count = $('#items-form-container').children().length;
var tmplMarkup = $('#item-template').html();
var compiledTmpl = tmplMarkup.replace(/__prefix__/g, count);
$('div#items-form-container').append(compiledTmpl);
// update form count
$('#id_item_items-TOTAL_FORMS').attr('value', count+1);
// some animate to scroll to view our new form
$('html, body').animate({
scrollTop: $("#add-item-button").position().top-200
}, 800);
});
});
</script>
形式:
class BilddokumentationForm(ModelForm):
class Meta:
model = Bilddokumentation
exclude = ['user', 'datum', 'auftrag']
widgets = {
'name': Textarea,
}
我可以看到第二种形式位于POST
数据中,但它不会出现在cleaned_data
中。
这样做的正确方法是什么?为什么Django丢弃第二种形式?