Django内联表单集-仅保存第一个表单集
我试图动态添加表单集,但在提交表单集后,只保存第一条记录,而忽略其余记录 我是django新手,不知道这个问题是在django代码中还是在js代码中 models.py forms.py views.py 模板Django内联表单集-仅保存第一个表单集,django,python-3.x,django-forms,django-templates,inline-formset,Django,Python 3.x,Django Forms,Django Templates,Inline Formset,我试图动态添加表单集,但在提交表单集后,只保存第一条记录,而忽略其余记录 我是django新手,不知道这个问题是在django代码中还是在js代码中 models.py forms.py views.py 模板 {%extends“base.html”%} {%load static%} {%block title%}{%endblock%} {%block content%} 样板 {%csrf_令牌%} {{institute.management_form}} {{form.as_p}}
{%extends“base.html”%}
{%load static%}
{%block title%}{%endblock%}
{%block content%}
样板
{%csrf_令牌%}
{{institute.management_form}}
{{form.as_p}}
{institute.forms%}
{{form.non_field_errors}}
{{form.errors}}
{{form}}
{%endfor%}
{{institute.empty_form}}
$(“#添加更多”)。单击(函数(){
var form_idx=$('#id_form-TOTAL_FORMS').val();
$('#form_set')。追加($('#empty_form').html()。替换(/#u前缀uu/g,form_idx));
$('id_form-TOTAL_FORMS').val(parseInt(form_idx)+1);
});
{%endblock%}
我原以为表单会保存所有记录,但它没有。
提交后如何使其保存所有记录?表单集需要正确的前缀 在前缀中添加表单集名称 就这样
如果您有任何问题,请让我知道对于我来说,它与
额外的
一起工作
像这样:
ClassFormSet = inlineformset_factory(ClassA, ClassB,
form=ClassForm, extra=2)
试着弄清楚是否所有数据都按预期到达后端。双击签入视图以查看对表单集的处理。(您为表单集定义了两次
instance
?一次是在创建时作为参数,第二次是在\u有效吗?)他们使用前缀:{{institute.prefix}}',
而不是前缀:{{formset.prefix}}
您的表单集名称是institute
而不是formset
。前缀设置正是问题所在!我还有一个问题,上面的内联表单集extra
显示时没有默认值。知道原因是什么吗?
class InstitutionForm(forms.ModelForm):
name = forms.ChoiceField(choices=[])
class Meta:
model = Institution
exclude = ()
def __init__(self, *args, **kwargs):
super(InstitutionForm, self).__init__(*args, **kwargs)
cleans = OriginalInstitutions.objects.values_list('name', flat=True)
self.fields['name'] = forms.ChoiceField(choices = [(name, name) for name in cleans])
class PvSystemForm(forms.ModelForm):
class Meta:
model = PvSystem
exclude = ()
InstitutionFormSet = inlineformset_factory(PvSystem, Institution,
form=InstitutionForm, extra=1)
class PVSystemList(ListView):
template_name = 'pvsystem/pvsystem_list.html'
model = PvSystem
class PVSystemDelete(DeleteView):
template_name = 'pvsystem/pvsystem_confirm_delete.html'
model = PvSystem
success_url = reverse_lazy('pvsystem-list')
class PVSystemCreate(CreateView):
template_name = 'pvsystem/pvsystem_form.html'
form_class = PvSystemForm
success_url = '/'
class PVSystemInstitutionCreate(CreateView):
template_name = 'pvsystem/pvsystem_form.html'
fields = ['gm_name','gm_email']
model = PvSystem
success_url = reverse_lazy('pvsystem-list')
def get_context_data(self, **kwargs):
data = super(PVSystemInstitutionCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['institute'] = InstitutionFormSet(self.request.POST)
else:
data['institute'] = InstitutionFormSet()
return data
def form_valid(self, form):
context = self.get_context_data()
institute = context['institute']
with transaction.atomic():
self.object = form.save()
if institute.is_valid():
institute.instance = self.object
institute.save()
return super(PVSystemInstitutionCreate, self).form_valid(form)
class PVSystemUpdate(UpdateView):
template_name = 'pvsystem/pvsystem_form.html'
form_class = PvSystemForm
success_url = '/'
class PVSystemInstitutionUpdate(UpdateView):
template_name = 'pvsystem/pvsystem_form.html'
model = PvSystem
fields = ['gm_name','gm_email']
success_url = reverse_lazy('pvsystem-list')
def get_context_data(self, **kwargs):
data = super(PVSystemInstitutionUpdate, self).get_context_data(**kwargs)
if self.request.POST:
data['institute'] = InstitutionFormSet(self.request.POST, instance=self.object)
else:
data['institute'] = InstitutionFormSet(instance=self.object)
return data
def form_valid(self, form):
context = self.get_context_data()
institute = context['institute']
with transaction.atomic():
self.object = form.save()
if institute.is_valid():
institute.instance = self.object
institute.save()
return super(PVSystemInstitutionUpdate, self).form_valid(form)
{% extends "base.html" %}
{% load static %}
{% block title %}{% endblock %}
{% block content %}
<h3>FormSet example</h3>
<form id="myForm" action="" method="post">{% csrf_token %}
{{ institute.management_form }}
<div id="form_set">
{{ form.as_p }}
{% for form in institute.forms %}
{{form.non_field_errors}}
{{form.errors}}
<table class='no_error'>
{{ form }}
</table>
{% endfor %}
</div>
<input type="button" value="Add More" id="add_more">
<div id="empty_form" style="display:none">
<table class='no_error'>
{{ institute.empty_form }}
</table>
</div>
<input type="submit" value="Save" id="save"/> <a href="{% url 'pvsystem-list' %}">back to the list</a>
</form>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="{% static 'formset/jquery.formset.js' %}"></script>
<script type="text/javascript">
$('#add_more').click(function() {
var form_idx = $('#id_form-TOTAL_FORMS').val();
$('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx));
$('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
});
</script>
<!-- <script type="text/javascript">
$(function() {
$('#myForm tbody tr').formset({
addText: 'add family member',
deleteText: 'remove',
prefix: '{{ formset.prefix }}'
});
})
</script> -->
{% endblock %}
$('.form_set').formset({
prefix: '{{ institute.prefix }}',
addText: 'Add New',
deleteText: 'Remove',
})
ClassFormSet = inlineformset_factory(ClassA, ClassB,
form=ClassForm, extra=2)