【问题标题】:inlineformset_factory Saves only First Row data?inlineformset_factory 只保存第一行数据?
【发布时间】:2019-05-29 18:08:51
【问题描述】:

我正在开发 inlineformset factory 一切正常,但 formset 数据只存储第一个值。

我正在使用 formset.js 文件来添加行。

父模型数据已保存,但表单集数据仅存储第一行信息

这是我的代码

forms.py

这是我的表单集代码

    SizeChartFormSet = inlineformset_factory(
        TailoringProductsMaster, SizeChart, extra=1,
        fields='__all__',
        form =SizeChartForm,
        can_delete=True,
        widgets={'SizeType': forms.TextInput(attrs={'class':"form-control col-md-7 col-xs-12",}),
                 'RequiredFabric': forms.TextInput(attrs={'class': "form-control col-md-7 col-xs-12",}),
                 },
    )

Views.py

这是我的视图代码

class TailoringProductsMasterCreateView(CreateView):
    model = TailoringProductsMaster
    form_class = TailoringProductsMasterForm
    success_url = reverse_lazy('home')

    def get_context_data(self, **kwargs):
        context = super(TailoringProductsMasterCreateView, self).get_context_data(**kwargs)
        if self.request.POST:
            context['operations_form'] = SizeChartFormSet(self.request.POST, self.request.FILES)

        else:
            context['operations_form'] = SizeChartFormSet()

        return context

    def post(self, request, *args, **kwargs):
        self.object = None
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        operations_form = SizeChartFormSet(self.request.POST, self.request.FILES)


        if (form.is_valid() and operations_form.is_valid()):
                return self.form_valid(form, operations_form)
        else:
            return self.form_invalid(form, operations_form)


    def form_valid(self, form, operations_form):

        self.object = form.save()
        operations_form.instance=self.object
        operations_form.save()

        return HttpResponseRedirect(self.get_success_url())


    def form_invalid(self, form, operations_form):

        return self.render_to_response(
            self.get_context_data(form=form, operations_form=operations_form ))

html 页面(查看主页 htmle 页面的链接 - http://www.codeshare.io/arY9l6 查看此漏洞 html 页面

                                                <tbody>
                                                     {% if operations_form.errors %}
                                {{ operations_form.errors }}
                            {% endif %}
                            {{ operations_form.non_field_erros }}

                            {% for object in operations_form %}
                            {{ object.id }}
                            <tr id="formset">
                                <td class="m-ticker">{{ object.SizeType }}</td>
                                <td>{{ object.RequiredFabric }}</td>
                                <td></td>
                            </tr>
                            {% endfor %}
                                                </tbody>

                                            </table>
{{ operations_form.management_form }}

【问题讨论】:

  • 我看不到你的整个模板,你确定你所有的表格都在&lt;form&gt;&lt;/form&gt;标签内吗?
  • codeshare.io/arY9l6看到这个洞html页面

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


【解决方案1】:

在您的模板中,您将覆盖表单 这个你做 2 次​​p>

{% for object in operations_form %}
  {{ object.id }}
  <tr id="formset">
  <td class="m-ticker">{{ object.SizeType }}</td>
  <td>{{ object.RequiredFabric }}</td>
  <td></td>
  </tr>
{% endfor %}

这一次

{% for gal in operations_form %}
  {{ gal.id }}
  <tr id="formset">
  <td class="m-ticker">{{ gal.SizeType }}</td>
  <td>{{ gal.RequiredFabric }}</td>
  </tr>
{% endfor %}

但这不是处理表单集的方法。您现在在模板中所做的基本上是这样的(三遍):

{% for form in formset %}
  {{ form.id }}
  {{ form.SizeType }}
  {{ form.RuiquiredFabric }}    
{% endfor %}

这将导致使用完全相同的 html 呈现相同的表单(您只使用不同的变量名,但这不会改变呈现的 html)

这就是为什么帖子数据中只显示一个表单(集)的原因。

更新

html 是正确的,所有数据都在 request.POST 中,所以它可能与您的 form_valid() 有关?

试试:

operations = operations_form.save(commit=False) 
for operation in operations: 
    operation.(fill in the field reference) = self.object
    operation.save()
operations.save()

【讨论】:

  • 我删除了所有注释代码。但仍然无法正常工作,请参阅 html 代码链接codeshare.io/arY9l6 只有一个表单集
  • 你能看到你在request.POST中输入的所有数据吗?
  • 是的 request.POST 我看到所有数据。但在数据库中只存储第一行数据
  • 发生错误: 禁止 save() 以防止由于未保存的相关对象“TailoringProducts”而导致数据丢失。在这一行操作.save()
  • def form_valid(self, form, operations_form): self.object = form.save() operations = operations_form.save(commit=False) for operation in operations: operation.instance = self.object operation.save() operations.save()
猜你喜欢
  • 2010-11-04
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多