如何将初始数据从QuerySet传递到formset?

时间:2019-12-30 12:29:35

标签: django django-models django-forms formset

我正在开发一个财产管理系统,现在我正在开发一个名为“财产检查”的应用程序,它基本上可以保存有关对某些财产进行检查的信息。

一个有用的用户告诉我,我可以使用表单集来实现。 我正在尝试使用模型TaskCheck创建一个表单集。每个TaskCheck都有一个属于一个属性的特定Task。这就是我创建的:

views.py

def add_taskcheck(request, property_pk, pk):
    tasks = Task.objects.filter(property=property_pk)
    tasks_list = Task.objects.filter(property=property_pk).values('task')
    TaskCheckFormset = formset_factory(TaskCheckForm, extra=0)
    if request.method == 'POST':
        #do something
    else:
        formset = TaskCheckFormset(initial=task_list)

    context = {
        'title':"Add Property Check",
        'task':tasks,
        'reference':property_pk,
        'formset':formset,
    }
    return render(request, 'propertycheck/add-taskcheck.html', context)

我的表单如下:

TaskCheck form 在这种情况下,任务“ Sofas:Check”不属于实例属性,因此它不应该存在于该属性中,并且应该将Task字段作为初始数据预先填充。

据我所了解的here,我应该将初始数据作为字典列表传递。因此,我使用.values()创建了“ tasks_list”,并尝试将其作为初始值传递:

tasks_list = Task.objects.filter(property=property_pk).values('task')
formset = TaskCheckFormset(initial=task_list)

所以我的问题是:

如何用queryset任务预先填充这些字段?

如何将行数限制为queryset任务对象的数量?

首先,我需要过滤属于特定属性的Task对象。

我尝试使用模型表单集,但是无法传递初始数据。 我也读过this question,但无法在表单中启动它。

我的模型。py:

class Task(models.Model):
    task = models.CharField(max_length=100)
    category = models.ForeignKey(Categories)
    property = models.ManyToManyField(Property)

class TaskCheck(models.Model):
    status = models.CharField(choices=STATUS_CHOICES, default='nd', max_length=50)
    image = models.ImageField(upload_to='task_check', blank=True, null=True)
    notes = models.TextField(max_length=500, blank=True)
    task = models.ForeignKey(Task)
    property_check = models.ForeignKey(Propertycheck)

1 个答案:

答案 0 :(得分:1)

如果您拥有pk中的Property,请首先获取实际对象:

property = get_object_or_404(Property, pk=property_pk)

然后创建所有相关TaskCheck对象的查询集:

qs = TaskCheck.objects.filter(task__property=property).distinct()

最后,您可以使用qs初始化模型表单集:

TaskCheckFormset = modelformset_factory(TaskCheck, form=TaskCheckForm, fields=('status', 'notes'))
formset = TaskCheckFormset(request.POST, queryset=qs)