【问题标题】:Django: Dynamic inline forms with filter upon user selectionDjango:用户选择时带有过滤器的动态内联表单
【发布时间】:2016-10-07 20:34:01
【问题描述】:

我已经创建了这些模型:

class Service(models.Model):
    name = models.CharField(blank=False, max_length=200)code here

class Monitor(models.Model):
    name = models.CharField(blank=False, max_length=100)
    services = models.ManyToManyField(Service, related_name='monitors')

class Student(models.Model):
    name = models.CharField(blank=False, max_length=100)

class ServiceMonitors(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    service = models.ForeignKey(Service, on_delete=models.CASCADE)
    monitors = models.ManyToManyField(Monitor)

这些模型代表了一家为学生提供多种服务的公司。为这家公司工作的监视器被分配给需要他们提供的服务的学生。监视器可以提供许多服务,并且每个服务都有许多学生。此外,一个学生可以拥有许多服务和监视器。

假设我们有 3 个服务,s1、s2 和 s3。当我们创建一个新的 Monitor 时,我们会为他/她分配其中的一些服务,比如 s1 和 s3。然后,当我们创建一个新学生时,我们应该能够选择学生将拥有哪些服务和监视器。

我的问题是我需要一个表格来创建学生(姓名、电话等),以便我能够:

  1. 从下拉控件中选择服务
  2. 选择服务后,表单必须显示提供该服务的监视器,因此我可以选择其中一个或多个(复选框)。
  3. 一个+按钮来创建/显示一个新的表单来重复这个过程,所以我 可以选择新的服务和相关的监视器。

我对 Django 很陌生。我已经能够在用户创建表单中创建一个内联表单,但我被困在这里。我现在有一个下拉控件来选择一个服务,以及一个带有 CheckboxSelectMultiple 小部件的 ModelMultipleChoiceField,它显示了所有监视器。从这里我需要知道当用户选择服务时如何过滤这些监视器,以及如何添加新表单来选择新的服务/监视器。

【问题讨论】:

    标签: python django forms inline-formset


    【解决方案1】:

    这可能无法在功能非常有限的 Django 表单框架中进行管理。它允许您在 ModelChoiceDropDown 中使用过滤的查询集进行选择(我认为这就是名称),但是无法通过这种方式在选择后进行过滤。 Django 的表单是作为 HTML 生成和发送的,如果不进行很多修改就无法过滤。

    您可能会这样做的方式是设置一个 REST 接口(请参阅 Django Rest Framework 或 Django-Tastypie)并使用您选择的前端框架将您的下拉列表链接到该接口(我更喜欢 Backbone.js,但是有很多选择)。这个想法是,一旦您选择了一项服务,随后的下拉菜单将向他们的请求添加一个过滤器,以仅显示提供该服务的监视器。

    如果您希望继续使用 Django 表单,您可以,但您需要扩展默认字段才能获得此类功能。

    这是一个相当大的兔子洞,我没有任何现成的资源可以为您指明方向。但是阅读 REST 接口是一个好的开始。

    【讨论】:

    • 谢谢你,Don,我想我会用自定义表单和一些 JS 来试试这个。当用户选择服务时,将尝试将所有服务显示为复选框并显示相关监视器。这样我就可以将过滤后的所有信息发送到客户端。
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2020-09-07
    • 2015-03-12
    • 1970-01-01
    • 2014-04-09
    • 2022-06-10
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多