繁体   English   中英

提交前如何在同一表格中获取 django 表格的价值?

[英]How to get value of django form within that same form before submission?

我正在创建一个带有 3 个选项字段的 django 表单。 我希望根据前 2 个选择字段填充第三个选择字段(对象字段)。 归结起来,我想我的问题是如何获取前 2 个选择字段的值,以便在提交之前可以在同一个 form.py 中使用这些值?

这是我的 forms.py 的样子,目前给我的错误是“超出最大递归深度”:

class MyForm(forms.Form):
    season = forms.ChoiceField(
        widget=forms.Select(attrs={"class": "form-control test"}),
        label="season",
        choices=SEASON_CHOICES,
    )
    episode = forms.ChoiceField(
        widget=forms.Select(attrs={"class": "form-control"}), label="episode"
    )

    object = forms.ChoiceField(
        widget=forms.Select(attrs={"class": "form-control"}),
        label="object",
    )

    def __init__(self, *args, **kwargs):
        super(forms.Form, self).__init__(*args, **kwargs)
        form = MyForm()
        season = form.cleaned_data.get["season"]
        episode = form.cleaned_data.get["episode"]
        try:
            snow = Snowflake()
            snow_data = snow.query(
                f"""select * from modern_family"""
            )

            object_data = snow.query(
                f"""select * from {season}.{episode}"""
            )
            snow.close()
            self.fields["episode"].choices = [(sd[0], sd[0]) for sd in snow_data]
            self.fields["object"].choices = [(sd[0], sd[0]) for sd in object_data]
        except Exception as e:
            print(e)

您要做的是创建一个“条件”表单,其中早期元素指示后期元素的格式或存在。

Django 不能开箱即用地处理这个用例,因为包含 forms 的视图是在服务器端创建并传递到客户端浏览器的。 不幸的是,Django 对客户端页面上发生的事情没有默认可见性。 cleaned_data是由提交的表单生成的,而不是当前正在填写的表单,因此您的方法不会按原样工作。

通常动态元素,如条件 forms 由 javascript 处理客户端,因为页面上的元素可以在提交之前使用 onchange() 或附加到表单元素的侦听器函数读取。

有几种方法可以尝试

  1. 将表单一分为二,并在单独的视图和表单中提供构造的第三个下拉菜单 - 为此您只需要 django

  2. 使用 HTMX 或 Ajax 通过 javascript 调用回服务器,然后根据响应适当地更改第三个下拉元素。 HTMX 可能是一个不错的选择,因为您可以直接从 django 模板提供新的下拉列表 HTML。 如果您需要对第三个下拉列表中应提供哪些选项进行服务器端计算,这是一个很好的方法。

  3. 单独使用 javascript 读取前两个下拉列表的值并修改第三个下拉列表。 如果您需要编辑第三个下拉列表的所有信息都包含在页面中,这是一个很好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM