【发布时间】:2019-04-11 20:00:51
【问题描述】:
我希望能够使用Add 按钮在我的formset 中动态添加django forms。
我尝试写不同的东西,但到目前为止我还没有克服得到预期的结果。
我在 forms.py 文件中定义了一个 formset:
AnimalFormSet = inlineformset_factory(Elevage, Animal, form=AnimalForm, extra=1)
然后,我在我的 views.py 文件中创建了这个函数:
class ElevageCreateView(CreateView):
model = Elevage
template_name = 'elevage_form.html'
def get_context_data(self, **kwargs):
context = super(ElevageCreateView, self).get_context_data(**kwargs)
context['AnimalFormSet'] = AnimalFormSet(self.request.POST or None, self.request.FILES or None)
return context
def form_valid(self, form):
context = self.get_context_data()
animal = context['AnimalFormSet']
if animal.is_valid():
self.object = form.save()
animal.instance = self.object
animal.save()
return super(ElevageCreateView, self).form_valid(form)
def get_success_url(self):
return reverse('animal-list')
最后,我正在尝试编写我的模板文件:
<fieldset>
<legend class="title"><span class="name">{% trans 'Animal form' %}</span></legend>
{{ AnimalFormSet.management_form }}
{% for form in AnimalFormSet.forms %}
<div class='table'>
<table class='no_error'>
{{ form.as_table }}
</table>
</div>
{% endfor %}
<input type="button" class="btn btn-default" value="Add More" id="add_more">
<script>
$('#add_more').click(function () {
cloneMore('div.table:last', 'service');
});
</script>
</fieldset>
我有 javascript 功能:
<script>
function cloneMore(selector, type) {
var newElement = $(selector).clone(true);
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);
}
</script>
我花了很多时间来获得预期的结果,但我没有克服它。所以如果你能帮助我,我需要你的帮助。
我不想使用其他库,但我接受JS、AJAX、JQuery 或django 的回答!
提前谢谢你
编辑:
问题是:
它显示第一个表单,但是当我想通过单击Add button 添加第二个表单时,它不会创建第二个表单。
所以我假设我的 Django 部分很好,但不是 JS 部分?
【问题讨论】:
-
您还没有真正确定所显示代码的具体问题是什么。它与预期结果有何不同?
-
好的,我将编辑我的代码。但是如果我也可以在这里回答,当我点击
Add button时,什么都不会出现。 -
问题在于函数调用
cloneMore('div.table:last', 'service');中的“选择器”部分。您的标记中没有带有class="table"的div元素来匹配调用。你可以参考stackoverflow.com/a/669982/1472458的答案 -
我编辑了我的答案,因为它似乎不适用于好的选择器。
-
没人?它使我在这个问题上被阻止了超过 1 周,并且有可能向表单集添加额外的表单:/
标签: javascript jquery ajax django formset