我正在使用模型中的字段,其中字段的值取决于在表单的前一个字段中选择的选项(当前是 via django administrator
)。为此,我正在使用django-smart-selects应用程序
我希望你能看到这个视频,让我对我的情况有一点了解,以及为什么我要询问与我正在使用的领域相关的调试或调试。
我放了一个视频,因为它最能说明我的情况,因为它们是根据选择的视觉事件。我不知道如何生成 gif 以将它们作为图像。如果打扰到您,请见谅。
视频中的父字段
Segmento afectado
允许您选择多个选项。视频中的子字段
Movimiento
显示了在父字段中选择的受影响片段可以执行的动作。
发生在我身上的情况
1、视频清晰的显示,当我在父字段中只选择一个受影响的段时,该段的移动选项出现在子字段中,并且在我的IDE控制台中status HTTP/1.1 200
带有GET操作的代码,表明移动对应于选定的受影响段可以成功获取和部署。
2.但是,当我在 Django 服务器日志中的 IDE 控制台中立即在父字段中选择多个受影响的段(如果我从 2 个段开始选择)时,代码会出现status HTTP/1.1 400
(Not Found
在我的 IDE 控制台中以黄色显示)因为它没有同化用户选择的第二个选择或第二个受影响的片段,因此,关联的动作或第二个受影响的片段可以执行的动作也不会显示在子字段中。
我不知道如何处理或评估这种情况,因为父 (Segment afectado
) 和子 ( Movimiento
) 字段所在的表单在 Django 管理员中表示,因为我有一个名为 AffectedSegment 的模型和另一个名为 Movementy 的ChainedManyToManyField
模型django-smart-selects是我让子字段中的值根据父字段的选择来显示。
我对这种行为的模型和价值链如下:
class AffectedSegment(models.Model):
SEGMENTO_ESCAPULA = 'ESCAPULA'
SEGMENTO_HOMBRO = 'HOMBRO'
SEGMENTO_CODO = 'CODO'
SEGMENTO_ANTEBRAZO = 'ANTEBRAZO'
SEGMENTO_CARPO_MUNECA = 'CARPO_MUNECA'
SEGMENTO_MANO = 'MANO'
SEGMENTO_CHOICES = (
(SEGMENTO_ESCAPULA, u'Escápula'),
(SEGMENTO_HOMBRO, u'Hombro'),
(SEGMENTO_CODO, u'Codo'),
(SEGMENTO_ANTEBRAZO, u'Antebrazo'),
(SEGMENTO_CARPO_MUNECA, u'Carpo/Muñeca'),
(SEGMENTO_MANO, u'Mano'),
)
affected_segment = models.CharField(max_length=12, choices=SEGMENTO_CHOICES, blank=False, verbose_name='Segmento afectado')
class Meta:
verbose_name = 'Segmentos corporale'
def __str__(self):
return "%s" % self.affected_segment
class Movement(models.Model):
type = models.CharField(max_length=255,verbose_name='Tipo de movimiento')
corporal_segment_associated = models.ManyToManyField(AffectedSegment, blank=False, verbose_name='Segmento corporal asociado')
class Meta:
verbose_name = 'Movimiento'
def __str__(self):
return "%s" % self.type
并且行为被链接或关联以便根据父字段中受影响片段的选择出现在子字段中的动作的方式是通过这种方式完成的:
class RehabilitationSession(models.Model):
affected_segment = models.ManyToManyField(AffectedSegment,verbose_name='Segmento afectado')
movement = ChainedManyToManyField(
Movement, #Modelo encadenado
chained_field = 'affected_segment',
chained_model_field = 'corporal_segment_associated',
verbose_name='Movimiento'
)
class Meta:
verbose_name = 'Sesiones de Rehabilitación'
def __str__(self):
return "%s" % self.patient
#return "%s" % self.affected_segment
显然,另一个使用相同 django-smart-selects 应用程序的人也发生了同样的事情,因为在子字段中发生了意想不到的事情,他没有将他选择的信息保存在子字段中,实际上是一样的发生在我身上的事情(在视频的末尾你也可以详细说明)只是我在这里不提,以免使帖子更长。
我想不出我该如何应对这个挑战(对我来说是:P)。我假设当我不在 django admin 中而是在我的应用程序中渲染这些模型的这种形式时,同样的事情会发生,因为 admin 只是 Django 中的另一个应用程序,并且行为必须横切到整个 Django 框架本身。
你觉得我可以开始思考什么?重要的是,两个字段(父项和子项)都是多项选择。
突然想到另一种机制,根据对前一个字段的选择来显示字段中的值?我还有什么其他方法可以解决这个要求?
纯 JavaScript(ajax,一些前端框架)?另一个应用程序做同样的事情?
在这方面的任何合作都将受到高度赞赏。干杯
您可以尝试使用 Pycharm 调试器(例如)查看所有变量及其元数据的内容,它会突出显示最近修改过的那些,行为会因某些内容而被修改。
社区版中的 Pycharm 没有 Django 调试器,但如果您选择它作为启动脚本
manage.py
,它可以正常工作。伙计们,感谢你们花时间帮助我解决我的问题。
根据以下答案,
django-smart-selects
它不会在处理用户制作requests
的文件的正则表达式中实现接收逗号分隔值的那些。urls.py
requests
当我在 Affected Segments 字段中选择一个选项时(这是一个多项选择)
django-smat-select
,它会正确处理请求,获得一个代码HTTP/1.1" 200
但是,当我选择多个受影响的段时,我会收到此消息
NotFound
谁在答案中指导我为我提供了一些替代解决方案,例如:
django-smart-selects
以便它可以requests
处理以逗号分隔的整数,并且在处理它时,它会根据必须显示的选项返回所需的结果。关于获取以逗号分隔的整数值的url,我该如何开始调查呢?
我想到了一些资源,例如:
https://docs.djangoproject.com/en/1.9/ref/validators/#validate-comma-separated-integer-list
https://stackoverflow.com/questions/16321007/python-regular-expression-regex-match-comma-separated-number-why-does-this-n
https://stackoverflow.com/questions/2921453/regex-comma-delimited-integers
在根据首先选择的选项返回所需结果的选项中,我不清楚应该如何返回必须显示的字段。
也许通过在某处修改查询集,例如在过滤模型链接的结果时?
他们为我提供的另一种选择是,在我的管理课程中,我可以根据前一个字段的选择覆盖我的字段的一些查询,我不太清楚这是怎么回事。
另一种选择是寻找其他一些应用程序。
我希望能够尝试第一个选项,为此我必须记录更多关于我应该如何进行的信息。
因此,当在父模型中选择多个选项时,这是应用程序
django-smart-selects
在使用链接模型时的当前状态,当前它没有收到,但在所述父模型中只收到一个选择,因此它不显示当在父模型中选择第二个值或字段的第二个选择时,子模型中链接的选项。欢迎任何考虑或赞赏。
我建议您将 vue js+ajax 与 vue 资源或 axios 一起使用,一开始我就像您在寻找替代品一样,因为我必须使用智能选择,并且我尝试了 django smart selects 但它非常麻烦,我更喜欢这样做事情是一步一步来的,相信我,它可以帮助你使用一种整洁和原生的工作方式,而且代码并不多。您只需发出 get 请求并从 django 返回一个 json 响应,就是这样,您使用 v-for v-if 和 v-bind 使用 vue js 组织所有内容,相信我,这很神奇。它看起来像很多客户端代码,但我向你保证不是。
请注意,没有比这个涉及 2 个选择更简单的示例了,第一个是我用 python 调用的父级,它的双键通过后端通过它,第二个选择取决于在 python 中进行的查询同样,以 json 格式发送并使用来自 Vue js 的 v-for 遍历。
现在是后端的一部分,我在其中对 get 发送的参数进行简码。
与轴。除了选择之外,您还有一个从表单保存数据的指南,该指南无需安装 django 应用程序,无需配置权限或任何东西,只需序列化本机 python 模块和响应请求的模块即可。关于 vue js,我推荐 rimorsoft 的https://www.youtube.com/watch?v=WKOZ2xPWURU&t=22s我推荐完整的课程,以便您熟悉这个非凡的前端框架。从这个例子开始,您将能够学习如何做你自己的选择更好的个性化和不那么繁琐的工作方式。