如何保存Django ModelFormSet?

2024-10-01 17:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在很绝望,我想不通。对我来说,这应该很容易做到,但我还没有找到任何解释这一点的答案。在

两种型号之间没有外键:

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的一个modelformset。在

^{pr2}$

然后进来视图.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)

在表单文件.html公司名称:

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

一旦我点击Submit,formset就会被解析为invalid,并且f.errors状态(对于Employee中的每一行):

<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并将它们保存到SalaryFormSet中。不应更新薪资中的记录,但应创建新条目。在

雇员模型已经有从管理站点创建的记录。随着员工工资的增长,我将从薪资模型生成工资条,并从最新日期获取相关工资。在

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


Tags: form名称returnmodelsrequestemployeeliul
2条回答

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

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

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

这只是根据丹尼尔·罗斯曼的解决方案总结一下答案。在

在模型.py公司名称:

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)

在表单.py公司名称:

^{pr2}$

在视图.py公司名称:

def createForm(request):
    formset = SalaryFormSet(initial=employees, queryset=Salary.objects.none())
    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)

相关问题 更多 >

    热门问题