【问题标题】:Django save inline formset from template viewDjango 从模板视图中保存内联表单集
【发布时间】:2020-09-18 21:17:57
【问题描述】:

拥有一个具有一对多关系的主从对象:

from django.db import models


class Master(models.Model):

    field1 = models.CharField(max_length=100)
    field2 = models.IntegerField()


class Detail(models.Model):

    field3 = models.IntegerField()
    field4 = models.IntegerField()
    field5 = models.IntegerField()
    master = models.ForeignKey(Master, on_delete=models.CASCADE)

有关详细信息,我有一个 ModelForm 和一个内联表单集:

from django import forms
from .models import Master, Detail


class MasterForm(forms.Form):

    field1 = forms.CharField(label='Field 1', max_length=100)
    field2 = forms.IntegerField(label='Field 2')


class DetailsForm(forms.ModelForm):
    class Meta:
        model = Detail
        exclude = ()


DetailsFormset = forms.inlineformset_factory(
    Master, Detail, form=DetailsForm, extra=1)

我有一个模板视图:

class MasterDetailsView(TemplateView):

    template_name = 'app/master_detailsview.html'

    def post(self, request, *args, **kwargs):
        print('IN POST!')
        details_formset = DetailsFormset(request.POST)
        if details_formset.is_valid():
            print('FORMSET VALID!')
            Master.objects.get(pk=self.kwargs['pk']).save()
            details_formset.save()
        else:
            print('ERRORS!')
            print(details_formset.errors)
        return HttpResponseRedirect(self.request.path_info)

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        pk = self.kwargs['pk']
        master_instance = Master.objects.get(pk=pk)
        context['master_instance'] = master_instance
        if self.request.POST:
            context['details_formset'] = DetailsFormset(self.request.POST, instance=master_instance)
        else:
            context['details_formset'] = DetailsFormset(instance=master_instance)
        return context

和模板:

{% extends 'base.html' %}

{% block contents %}

<table class="table table-bordered">
  <tr>
    <th>Field 1</th>
    <th>Field 2</th>
  </tr>
  <tr>
    <td>{{ master_instance.field1 }}</td>
    <td>{{ master_instance.field2 }}</td>
  </tr>
</table>
<hr/ >
  <form action="" method="post">
    {% csrf_token %}
    {{ details_formset.as_p }}
    <input type="submit" value="Save" />
  </form>
<hr/ >

{% endblock %}

我在控制台中遇到的错误:

[{'master': ['The inline value did not match the parent instance.']}]

我想我的观点是不对的。我尝试获取主记录并将其保存在详细信息表单集之前,但同样的错误。我没有使用 CreateView,因为这是一个学习项目。

【问题讨论】:

    标签: python django django-forms django-views django-templates


    【解决方案1】:

    尝试在模板中的csrf_token 正下方添加{{details_formset.management_form}}

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 2017-03-21
      • 2015-11-01
      • 2016-10-09
      • 1970-01-01
      • 2011-10-11
      相关资源
      最近更新 更多