【问题标题】:Django inline formsets - only save the first formsetDjango 内联表单集 - 仅保存第一个表单集
【发布时间】:2019-09-02 18:42:57
【问题描述】:

我正在尝试动态添加表单集,但提交后仅保存第一条记录并忽略其余记录。

我是 django 新手,不知道是我的 django 代码还是 js 代码中的问题。

models.py

class PvSystem(models.Model):
    gm_name = models.CharField(max_length=60, blank=True, null=True)
    gm_email = models.CharField(max_length=60, blank=True, null=True)

class Institution(models.Model):
    name = models.CharField(max_length=60, blank=True, null=True)
    tax_card = models.CharField(max_length=15, blank=True, null=True)
    pvsystem = models.ForeignKey(PvSystem, on_delete=models.CASCADE, 
    blank=True, null=True)

class OriginalInstitutions(models.Model):
    name = models.CharField(max_length=60, blank=True, null=True)
    tax_card = models.CharField(max_length=15, blank=True, null=True)
    pvsystem = models.ForeignKey(PvSystem, on_delete=models.CASCADE, 
    blank=True, null=True)

forms.py

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)

views.py

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 %}

我预计表单会保存所有记录,但它没有。 提交后如何保存所有记录?

【问题讨论】:

  • 尝试确定所有数据是否按预期到达后端。仔细检查您对表单集的处理。 (您为表单集定义了两次instance?一次作为参数创建,第二次在 is_valid 之后?)

标签: django python-3.x django-forms django-templates inline-formset


【解决方案1】:

formset 需要适当的前缀 在前缀中添加表单集名称 就是这样

    $('.form_set').formset({
         prefix: '{{ institute.prefix }}',
         addText: 'Add New',
         deleteText: 'Remove',
    })

如果您有任何问题,请告诉我

【讨论】:

  • 嘿使用prefix: '{{ institute.prefix }}', insted of prefix: '{{ formset.prefix }}' 你的表单集名称是institute 而不是formset
  • 前缀设置正是问题所在!我还有另一个问题,extra 上方的内联表单集显示没有默认值。知道可能是什么原因吗?
【解决方案2】:

对我来说,它与extra 以上 1 一起使用

像这样:

ClassFormSet = inlineformset_factory(ClassA, ClassB,
                                             form=ClassForm, extra=2)

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2011-06-02
    • 2019-05-15
    • 2015-11-01
    相关资源
    最近更新 更多