Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:用户选择时带有过滤器的动态内联表单_Python_Django_Forms_Inline Formset - Fatal编程技术网

Python Django:用户选择时带有过滤器的动态内联表单

Python Django:用户选择时带有过滤器的动态内联表单,python,django,forms,inline-formset,Python,Django,Forms,Inline Formset,我创建了以下模型: 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_nam

我创建了以下模型:

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。当我们创建一个新的监视器时,我们会为他/她分配一些服务,比如s1和s3。然后,当我们创建一个新学生时,我们应该能够选择学生将拥有哪些服务和监视器

我这里的问题是,我需要一个表单来创建学生(姓名、电话等),该表单允许我:

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

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

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

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

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


    这是一个相当大的兔子洞,我手头没有任何资源可以告诉你。但是阅读REST接口是一个很好的开始。

    谢谢你,唐,我想我会尝试使用自定义表单和一些JS。将尝试将所有服务显示为复选框,并在用户选择服务时显示相关监视器。通过这种方式,我可以将过滤后的所有信息发送到客户端。