Django 复合表单 - 如何构建和保存它们?
Django composite forms - how do I build and save them?
我正在尝试构建一个可以提供报告跟踪的表单。报告本身是 ProjectReport
class,它链接所有可用的实例 ReportAtoms
。每个 ReportAtom
都是 RAGItem
(如 "Progress"、"Risks"、"Resources")和 RAGMarker
("Green"、"Red"):
class ProjectStatus(CoreBase):
report_project = models.ForeignKey('Project')
report_items = models.ManyToManyField('RAGReportAtom')
report_date = models.DateTimeField(default=datetime.now())
class RAGReportAtom(CoreBase):
item = models.ForeignKey(DicRAGItem)
marker = models.ForeignKey(DicRAGMarker)
comments = models.TextField(null=True, blank=True)
class DicRAGItem(DicCoreBase):
name = models.CharField(max_length=64, unique=True)
description = models.TextField(null=True, blank=True)
is_used_for_portfolio = models.BooleanField(default=False)
is_used_for_project = models.BooleanField(default=True)
is_used_for_milestone = models.BooleanField(default=True
class DicRAGMarker(DicCoreBase):
name = models.CharField(max_length=16, unique=True)
color_code = models.CharField(max_length=7, unique=True)
icon = models.FileField(upload_to='RAG_SIMPLE_ICONS', null=True, blank=True)
这是图形表示的方式:
所以我在这里要做的基本上是这样的:
- 获取所有可用报告项目的列表(报告的事物)
- 构建一个将显示所有报告项目并让用户select为每个项目做标记的表单
- 用户可以发表评论
- 提交表单后,我创建了与最终拥有的一样多的报告原子(项目和标记的组合)和一个链接所有它们的 ProjectReport 实例。
与此类似的内容:
是否可以用 Django.forms 和 crispy 生成此表格?我对大多数表单都使用 django rest 框架 - 也许我也可以利用它?
实际上,您甚至不需要松脆的表格就可以做到这一点。
Formsets 是正确的选择! Official documentation
基本上它看起来像:
from django.forms.formsets import formset_factory
from myapp.models import ProjectReport
from myapp.forms import ReportAtomForm
# We use values() because initial data needs to be a dict
list_of_reports = ProjectReport.objects.get(id=key).report_items.values()
ReportAtomFormSet = formset_factory(ReportAtomForm)
formset = ArticleFormSet(initial=list_of_reports)
那么您的视图需要按照文档中的描述处理表单集。对于标记和项目,它们必须是 ReportAtomForm 内的内联表单集,如您在此处看到的:https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#inline-formsets
我正在尝试构建一个可以提供报告跟踪的表单。报告本身是 ProjectReport
class,它链接所有可用的实例 ReportAtoms
。每个 ReportAtom
都是 RAGItem
(如 "Progress"、"Risks"、"Resources")和 RAGMarker
("Green"、"Red"):
class ProjectStatus(CoreBase):
report_project = models.ForeignKey('Project')
report_items = models.ManyToManyField('RAGReportAtom')
report_date = models.DateTimeField(default=datetime.now())
class RAGReportAtom(CoreBase):
item = models.ForeignKey(DicRAGItem)
marker = models.ForeignKey(DicRAGMarker)
comments = models.TextField(null=True, blank=True)
class DicRAGItem(DicCoreBase):
name = models.CharField(max_length=64, unique=True)
description = models.TextField(null=True, blank=True)
is_used_for_portfolio = models.BooleanField(default=False)
is_used_for_project = models.BooleanField(default=True)
is_used_for_milestone = models.BooleanField(default=True
class DicRAGMarker(DicCoreBase):
name = models.CharField(max_length=16, unique=True)
color_code = models.CharField(max_length=7, unique=True)
icon = models.FileField(upload_to='RAG_SIMPLE_ICONS', null=True, blank=True)
这是图形表示的方式:
所以我在这里要做的基本上是这样的:
- 获取所有可用报告项目的列表(报告的事物)
- 构建一个将显示所有报告项目并让用户select为每个项目做标记的表单
- 用户可以发表评论
- 提交表单后,我创建了与最终拥有的一样多的报告原子(项目和标记的组合)和一个链接所有它们的 ProjectReport 实例。
与此类似的内容:
是否可以用 Django.forms 和 crispy 生成此表格?我对大多数表单都使用 django rest 框架 - 也许我也可以利用它?
实际上,您甚至不需要松脆的表格就可以做到这一点。
Formsets 是正确的选择! Official documentation
基本上它看起来像:
from django.forms.formsets import formset_factory
from myapp.models import ProjectReport
from myapp.forms import ReportAtomForm
# We use values() because initial data needs to be a dict
list_of_reports = ProjectReport.objects.get(id=key).report_items.values()
ReportAtomFormSet = formset_factory(ReportAtomForm)
formset = ArticleFormSet(initial=list_of_reports)
那么您的视图需要按照文档中的描述处理表单集。对于标记和项目,它们必须是 ReportAtomForm 内的内联表单集,如您在此处看到的:https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#inline-formsets