我现在很绝望,我无法弄清楚这一点。对我来说这应该很容易做到,但我还没有遇到任何解释这一点的答案。

两个模型之间没有外键:

class Employee(models.Model):
    surname = models.CharField(max_length=100)
    name = models.CharField(max_length=100)


class Salary(models.Model):
    date = models.DateField(auto_now_add=True)
    surname = models.CharField(max_length=100)
    name = models.CharField(max_length=100)
    salary = models.DecimalField(max_digits=20, decimal_places=2)

要保存到 ModelB 的一个模型集。
SalaryFormSet = modelformset_factory(Salary, extra=0)

然后在views.py中:
def createForm(request):
    formset = SalaryFormSet(queryset=Employee.objects.all())
    return render(request, 'formfile.html', {'formset': formset})

def submitForm(request)
    f = ModelBFormSet(request.POST)
    if f.is_valid():
        f.save()
        return HttpResponse('Submitted successfully')
    else:
        return HttpResponse(f.errors, request.POST)

在 formfile.html 中:
<form action="submitForm/" method="post">
    {{ formset.management_form }}
    <table>
        {{ formset }}
    </table>
    {% csrf_token %}
    <input type="submit" value="Submit">
</form>

一旦我点击提交,表单集就会被解析为无效和 f.errors 状态(对于员工中的每一行):
<ul class="errorlist"><li>id<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul>

我只想将 Employee 中所有行的姓氏和姓名预加载到 SalaryFormSet 中,我应该为每一行输入薪水并将它们保存到薪水。 Salary 中的记录不应更新,但应创建一个新条目。

Employee 模型已经有从管理站点创建的记录。随着员工工资的增加,我将根据工资模型生成工资单并捕获最近日期的相关工资。

如果我将查询集更改为 queryset=Salary.objects.none() 并将 SalaryFormSet 更改为 extra=2,则模板呈现为空。如果我手动插入姓氏、姓名和薪水,则表单集会正确保存。工资中有两个新条目。为什么我不能只预加载名称(我应该将它们加载为 str()?)并手动添加工资?

最佳答案

正如我在评论中所说,将员工的查询集传递给工资表单集的实例化是没有意义的。我认为,无论出于何种原因,您都试图将这两个模型完全分开,并且每次都想创建新的 Salary 实例,因此最好只传递一组 initial 数据。

这有点棘手,因为initial只适用于额外的表单,而extra是由formset工厂设置的,所以需要在 View 中进行。像这样的东西:

employees = Employee.objects.values('name', 'surname')
SalaryFormSet = modelformset_factory(Salary, extra=len(employees))
formset = SalaryFormSet(initial=employees, queryset=Salary.objects.none())

关于python - 如何保存 Django ModelFormSet?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28623544/

10-14 03:11