如何将初始数据从 QuerySet 传递到 formset?
How to pass initial data from QuerySet to formset?
我正在开发一个 属性 管理系统,现在我正在开发一个名为 属性 check 的应用程序,它主要保存有关对某些属性进行检查的信息。
一位乐于助人的用户告诉我,我可以使用表单集来实现它。
我正在尝试使用我的模型 TaskCheck 创建一个表单集。每个 TaskCheck 都有属于一个 属性 的特定任务。这就是我创建的:
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)
我的表单如下所示:
在这种情况下,Task "Sofas: Check" 不属于实例 属性,因此它不应该存在,字段 Task 应该作为初始数据预先填充。
据我所知 here 我应该将初始数据作为字典列表传递。所以我用 .values() 创建了 "tasks_list" 并尝试将其作为初始值传递:
tasks_list = Task.objects.filter(property=property_pk).values('task')
formset = TaskCheckFormset(initial=task_list)
所以我的问题是:
如何使用查询集任务预填充这些字段?
如何将行数限制为查询集任务对象的数量?
首先我需要过滤属于特定 属性 的任务对象。
我试过使用模型表单集,但无法传递初始数据。
我也读过 但我无法在表单内启动它。
我的models.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)
如果您有 Property
的 pk
,首先获取实际对象:
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)
我正在开发一个 属性 管理系统,现在我正在开发一个名为 属性 check 的应用程序,它主要保存有关对某些属性进行检查的信息。
一位乐于助人的用户告诉我,我可以使用表单集来实现它。 我正在尝试使用我的模型 TaskCheck 创建一个表单集。每个 TaskCheck 都有属于一个 属性 的特定任务。这就是我创建的:
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)
我的表单如下所示:
据我所知 here 我应该将初始数据作为字典列表传递。所以我用 .values() 创建了 "tasks_list" 并尝试将其作为初始值传递:
tasks_list = Task.objects.filter(property=property_pk).values('task')
formset = TaskCheckFormset(initial=task_list)
所以我的问题是:
如何使用查询集任务预填充这些字段?
如何将行数限制为查询集任务对象的数量?
首先我需要过滤属于特定 属性 的任务对象。
我试过使用模型表单集,但无法传递初始数据。
我也读过
我的models.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)
如果您有 Property
的 pk
,首先获取实际对象:
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)