如何以编程方式将条件字段添加到 wagtail 页面类型?

Lal*_*s M 7 django wagtail

I\xe2\x80\x99m 尝试将条件字段添加到 wagtail 页面类型模型,条件字段可能如下图所示。有两个字段:QuestionAnswer。应根据问题字段的选择显示答案字段

\n\n

在此输入图像描述

\n\n

如果我们从问题中选择丰田,那么凯美瑞陆地巡洋舰应该显示在答案下拉列表中,如果我们选择本田,那么思域雅阁应该显示在答案中。

\n\n

在blocks.py中我有两个类分别负责问题答案字段

\n\n
class ConditionsQuestionBlock(blocks.ChooserBlock):\n  widget = Select\n  class Meta:\n    icon = "question"\n\n  @cached_property\n  def target_model(self):\n    return Question\n\n  @cached_property\n  def field(self):\n    return forms.ModelChoiceField(\n        queryset=Question.objects.all(),\n        widget=self.widget,\n        required=self._required,\n    )\n\n  def value_for_form(self, value):\n    if isinstance(value, User):\n        return value.pk\n    else:\n        print("selected q:",value)\n        selectedqval=value\n        print("selected qvalue:",selectedqval)\n        return value\n\nclass ConditionsAnswerBlock(blocks.ChooserBlock):\n  widget = Select\n  class Meta:\n    icon = "question"\n\n  @cached_property\n  def target_model(self):\n    return Choice\n\n  @cached_property\n  def field(self):\n    choice=Choice.objects.all()\n    return forms.ModelChoiceField(\n        queryset=choice,\n        widget=self.widget,\n        required=self._required,\n    )\n\n  def value_for_form(self, value):\n    if isinstance(value, User):\n        return value.pk\n    else:\n        return value\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,无论问题选择如何,我都会获得所有答案选项

\n

Ram*_*h-X 1

据我了解,这是无法通过wagtailDjango直接实现的。这实际上是一个 HTML 问题。

Wagtail 和 Django 使用纯 HTML/CSS 来创建其 UI 元素。这些 UI 元素使用表单提交与pythonwagtail/django 中的代码进行交互。HTML这意味着使用POST请求。
与代码交互的另一种方法python是使用重定向,即GET请求。但这样你就无法访问 UI 元素。

首先,您可以为每个答案组设置隐藏的选择字段。在这种情况下,有两个选择字段,其中一个是凯美瑞陆地巡洋舰,另一个是思域雅阁。

然后,您必须编写一些javascript代码来在触发问题选择事件时显示/隐藏以及所需的选择字段。您可以在中搜索事件触发器HTML以获取更多信息。

表单提交后,您可以读取问题的值以及相应答案字段的值。