对于两个单独的表单是否可以通过表单集在同一个视图中处理,我有点不清楚。
例如,考虑这两种模型:
class Task(models.Model):
title= models.CharField(max_length=30)
approvers = models.ManyToManyField(
get_user_model(), through='TaskStep')
class TaskStep(models.Model):
approver = models.ForeignKey(
get_user_model(), null=True, on_delete=models.SET_NULL)
task = models.ForeignKey(Task, null=True, on_delete=models.SET_NULL)是否可以同时编辑任务模型实例和相关任务步骤的单一表单,我可以在一次提交中更新该表单?
我知道我可以使用inlineformset_factory来显示TaskStep子选项,但是上面没有多少文档。
如果在视图中传递以下内容:
def manage_tasks(request, task_id):
task = Task.objects.get(pk=task_id)
TaskStepInlineFormSet = inlineformset_factory(TaskStep, Task, exclude=('',))
if request.method == "POST":
formset = TaskStepInlineFormSet(request.POST, request.FILES, instance=task)
if formset.is_valid():
formset.save()
# etc这只显示TaskStep对象,而不显示父Task。
发布于 2019-08-29 18:31:12
一个视图是的,但不是单一的形式。您需要一个ModelForm来编辑您的Task,需要一个InlineFormSet来编辑TaskStep。
FormSet的工作原理。这使您对如何呈现它们、管理表单如何工作以及添加或删除单个表单需要做什么有一个大致的理解。model formsets,它与模型(在您的例子中是TaskStep)有关。这将教会您如何根据提交的格式集保存、更新和删除模型。在您的观点中,有一件事是错误的,就是您指定的模型的顺序。它应该是:
inlineformset_factory(Task, TaskStep) # TaskStep is the model being edited, Task is the parent在您的视图中,您希望同时为您的TaskForm和formset创建formset。这两种方法都是使用task实例和在POST情况下发布的数据(request.POST和request.FILES)初始化的。
然后验证两者,如果它们都是有效的,则可以保存它们,如果不只是用无效的表单重新呈现模板的话。就像你处理一张表格一样。
在模板中,呈现所有表单(task_form和循环遍历formset中的所有表单),在中呈现一个 <form>标记。
https://stackoverflow.com/questions/57714154
复制相似问题