【问题标题】:Django composite forms - how do I build and save them?Django 复合表单 - 我如何构建和保存它们?
【发布时间】:2015-06-07 19:55:13
【问题描述】:

我正在尝试构建一个可以提供报告跟踪的表单。报告本身是ProjectReport 类,它链接所有可用ReportAtoms 的实例。每个ReportAtom 都是RAGItem(如“进度”、“风险”、“资源”)和RAGMarker(“绿色”、“红色”)的组合:

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)

这是可以用图形表示的方式:

所以我在这里要做的基本上是这样的:

  1. 获取所有可用报告项目的列表(报告的内容)
  2. 构建一个显示所有报告项目的表单,并让用户为每个项目选择一个标记
  3. 用户可以离开 cmets
  4. 提交表单后,我创建了与最终拥有的报告原子一样多的报告原子(项目和标记的组合)和一个链接所有它们的 ProjectReport 实例。

类似的东西:

这是否可以用 Django.forms 和crispy 生成这个表单?我正在为大多数表单使用 django rest 框架 - 也许我也可以使用它?

【问题讨论】:

    标签: django forms django-forms django-rest-framework django-crispy-forms


    【解决方案1】:

    实际上,您甚至不需要酥脆的表格来做到这一点。

    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

    【讨论】:

    • 是的,我想出了 formset 的东西,它可以工作 - 我得到一个带有两个下拉列表(一个预选)和 cmets 字段的表单 - 但是我如何将其中一个下拉列表显示为文本?
    • 您的意思是您有 2 个下拉列表:标记和项目,并且您希望标记是一个下拉列表,而项目只是项目对象的文本表示?使用 Django 没有直接的方法可以做到这一点。最直接的方法是重写 ReportAtomForm 的 init 方法来设置“item_name”属性,然后将其显示在模板中。在 int 中,您可以通过 self.instance 访问 ReportAtom 对象。 def __init__(self, *args,**kwargs): super().__init__(*args,**kwargs) self.item_name = self.instance.item.name
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2013-01-11
    • 2020-02-16
    • 2012-11-08
    • 2023-03-28
    相关资源
    最近更新 更多