【问题标题】:How to edit model objects in an inline formset in Django如何在 Django 的内联表单集中编辑模型对象
【发布时间】:2020-02-12 08:50:36
【问题描述】:

在 Django 中,我尝试使用内联表单集工厂,以便用户可以通过外键编辑与父模型相关的模型实例。出于某种原因,我尝试的方法不会保存我在单击提交时所做的更改。

我的视图是这样的(不包括渲染):

def edit_sets(request, exercisegroup_id):


    exercisename = ExerciseName.objects.get(pk=exercisegroup_id)
    SetLoggerFormSet = inlineformset_factory(ExerciseName, SetLogger, fields=('weight','reps',))

    formset = SetLoggerFormSet(instance=exercisename)


    if request.method == 'POST':  
      formset = SetLoggerFormSet(request.POST, instance=exercisename)
      if formset.is_valid():
         formset.save()
      else:
        formset = SetLoggerFormSet(instance=exercisename)

我在模板的表单集中显示每个表单,以便用户可以单独编辑实例:

<form method="post">{% csrf_token %}
               {{ formset.management_form}}
               <table>
                  {% for form in formset %}
                        {{ form }}
                  {% endfor %}
               </table>
               <button type="submit" class="save btn btn-default">Save set</button>
          </form>

不知道为什么这不起作用。表单按原样显示,并且此方法以前曾用于添加对象,但我仍然无法使用它来替换查询集中的这些对象之一。我错过了什么我应该做的不同的事情吗?

编辑:

原来解决方案是将我的 request.method 语句更改为:

if request.method == 'POST':  
      formset = SetsFormSet(request.POST, instance=exercisename)
      for form in formset:
        if form.is_valid():
           form.save()

这允许我将每个表单单独保存在表单集中,因为我只更改了表单集中的一部分。

【问题讨论】:

标签: python django django-forms backend formset


【解决方案1】:

您的代码对我有用。也许您已经更改了环境设置或其他内容。当您提交表单时,是否有任何错误显示给您?如果是这样,请向我们展示您的错误详情。

你可以这样试试:

def edit_sets(request, exercisegroup_id):
    exercisename = ExerciseName.objects.get(pk=exercisegroup_id)
    SetLoggerFormSet = inlineformset_factory(ExerciseName, SetLogger, fields=('weight','reps',))

    formset = SetLoggerFormSet(instance=exercisename)


    if request.method == 'POST':  
      formset = SetLoggerFormSet(request.POST, instance=exercisename)
      if formset.is_valid():
         formset.save()
      else:
        print("something is wrong in validation")
        print(formset.errors)
        formset = SetLoggerFormSet(instance=exercisename)

【讨论】:

  • 是的,结果证明我在表单集中输入的任何内容都被视为无效。考虑到这些字段只是简单的 IntegerFields,这似乎很奇怪。也许这与我在表单集中编辑单个表单而不是整个表单集本身有关?
  • 不,我不这么认为formset.errors 会返回所有相关的表单错误
  • 设法找出解决方案,当我应该单独保存每个表单时,我试图保存整个表单集。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2014-01-01
  • 2012-03-15
  • 2010-09-30
  • 1970-01-01
  • 2012-01-05
  • 2010-12-06
相关资源
最近更新 更多