我正在创建一个Web应用程序,使用jQuery动态添加表单并使用django后端处理它们。我根据https://docs.djangoproject.com/en/dev/topics/forms/formsets/上的文档在django中使用了formsets,并尝试按照http://stellarchariot.com/blog/2011/02/dynamically-add-form-to-formset-using-javascript-and-django/上的示例和Dynamically adding a form to a Django formset with Ajax处的stackoverflow进行操作。
我遇到的问题是,当我提交表单时,我没有获得任何POST数据。当我删除变量{{formset.management_form}}时,我将数据发送到POST但得到错误[u'ManagementForm数据丢失或已被篡改']。如果我将管理表单放在模板中(我应该),我就没有POST数据。有人知道解决方案吗?
forms.py
from django import forms
from busker.models import *
from django.forms import ModelForm
class UploadFileForm(ModelForm):
class Meta:
model = UploadFile
class Category(models.Model):
category = models.CharField(max_length = 50)
def __unicode__(self):
return self.name
models.py
from django.db import models
class UploadFile(models.Model):
title = models.CharField(max_length = 50)
file = models.FileField(upload_to = 'test')
def __unicode__(self):
return self.name
class CategoryForm(ModelForm):
class Meta:
model = Category
views.py
def submit(request,action=''):
if request.user.is_authenticated():
class RequiredFormSet(BaseFormSet):
def __init__(self, *args, **kwargs):
super(RequiredFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
form.empty_permitted = False
UploadFileFormSet = formset_factory(UploadFileForm,extra=2, max_num=10, formset=RequiredFormSet)
if request.method == 'POST':
uploadfile_formset = UploadFileFormSet(request.POST, request.FILES,prefix='songs')
category_form= CategoryForm(request.POST,prefix = 'category')
if uploadfile_formset.is_valid and category_form.is_valid:
return HttpResponseRedirect('/') #going to the home root
else:
return HttpResponseRedirect('/contact') #testing to see if it fails
else:
uploadfile_formset = UploadFileFormSet(prefix = 'songs')
category_form= CategoryForm(prefix = 'category')
t = loader.get_template('submit.html')
c = RequestContext(request, {
'uploadfile_formset': uploadfile_formset,
'category_form': category_form,
'head_title': u'Submit Song',
'page_title': 'Submit Song',
})
return HttpResponse(t.render(c))
templates(submit.html)
<form id="songform" name="songform" enctype="multipart/form-data" action="" method="POST">{% csrf_token %}
{{uploadfile_formset.management_form}}
<div id="songforminputs">
{{category_form.as_p}}
{% for formset in uploadfile_formset %}
<div id="dynamicInput">
<p class = "songSubmitForm" > Song {{forloop.counter}} </p>
{% for field in formset %}
<label class="submitForm" for="title">{{ field.label }}</label>
{{field|add_class:"submitForm" }}
</br>
{% endfor %}
</div>
{% endfor %}
</div>
<input type="button" value="Add another text input" onClick="addInput('dynamicInput');">
<input type="button" value="Remove a text input" onClick="removeInput('dynamicInput');">
<input type="submit" name="submitbutton" id="submitbutton" value="" >
</form>
jQuery / javascript部分
<script type="text/javascript">
var counter = 2;
var minimum = 2;
var limit = 5;
function addInput(divName){
if (counter == limit) {
alert("You have reached the limit of adding " + counter + " inputs");
}
else {
var newdiv = document.createElement('div');
newdiv.id = "dynamicInput";
newdiv.innerHTML = "<p class = 'songSubmitForm' > Song " + (counter+1) +"</p>" + "<label for='title' class='submitForm' >Title</label>" + "<input id ='id_form-" + (counter)+ "-title'type='text' class='contact' name='form-" + counter +"-title'>" + "</br>" + "<label for='file' class='submitForm' >File</label>" + " <input id='id_form-"+counter+"-file' type='file' class='contact' name='form-"+counter+"-file'>" + "</br>" + "</br>";
document.getElementById('songforminputs').appendChild(newdiv);
counter++;
}
}
function removeInput(divName){
if (counter == minimum) {
alert("You need at least " + counter + " inputs");
}
else {
$('div#dynamicInput:last-child').remove()
counter--;
}
}
</script>
答案 0 :(得分:0)
我不认为你说你使用的是django-crispy-forms,但是,我会在这里发布这个错误的任何人遇到这个错误,谁知道,也许它也会帮助你。
我最近在尝试使用多个脆内联表单集时遇到了类似的问题。我在使用{{ formset.management_form }}
之前添加了{% cirspy formset.form formset.form.helper %}
。
脸部掌
当我加入管理表格时,表格中没有任何数据可供发布。当我没有包括管理表格时,django抱怨[u'ManagementForm data is missing or has been tampered with']
。
要解决这个问题,只需按照设计方式使用crispy-forms:{% crispy formset formset.form.helper %}
。这样就不需要在自己的标签中包含管理表单了,这似乎让Django感到困惑。