除非正在调试,否则不会填充字段值

问题描述 投票:0回答:1

我遇到了一个奇怪的问题,通常

field_val
应该设置为某个特定值,但被设置为“”。当我在 vscode 中调试并查看调试器中的值并检查它(可能触发某些内容)时,变量突然变得可用。当我不调试时,该值为空字符串。我无法理解这里发生了什么。我在 django 表单中缺少某种惰性评估吗?

当表单提交失败时,我试图将提交的值保留在数据列表中。尝试从

self.instance
获取该值,它基本上是我的 django 数据库模型的一个实例。

class DatalistFieldMixin:
    def make_field_datalist(self, field_name, choices, choice_format=lambda c: c):
        field_val = getattr(self.instance, field_name) or ""

        # Create the datalist widget while setting the html "value" attribute.
        # And set the widget as the form field.
        if self.fields.get(field_name):
            widget = DatalistWidget(
                choices=[choice_format(c) for c in choices],
                attrs={"value": field_val},
            )
            self.fields[field_name].widget = widget


class ObjectAdminForm(DatalistFieldMixin, forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.make_field_datalist(
            field_name="broadsign_active_container_id",
            choices=BroadsignContainer.objects.all(),
            choice_format=lambda c: (
                c.container_id,
                " - ".join((str(c.container_id), c.container_name)),
            ),
        )

真正快速的 gif 解释了我的问题:

python django django-admin
1个回答
0
投票

我无法理解这里发生了什么,但最终我从

self.data
self.instance
组合中获得了字段值。

本质上,这可以确保在以下情况下填充 html 数据列表输入值:

  • 表单提交失败,数据无效,
  • 如果实例已经有值,
  • 当字段为“无”时,将值设置为“”(否则在数据列表中显示为“无”)。

并且

or ""
中的
getattr(self.instance, field_name) or ""
部分是必要的,因为
getattr(self.instance, field_name)
实际上等于
None

class DatalistFieldMixin:
    def make_field_datalist(self, field_name, choices, choice_format=lambda c: c):
        field_val = self.data.get(field_name, getattr(self.instance, field_name) or "")

        # Create the datalist widget while setting the html "value" attribute.
        # And set the widget as the form field.
        if self.fields.get(field_name):
            widget = DatalistWidget(
                choices=[choice_format(c) for c in choices],
                attrs={"value": field_val},
            )
            self.fields[field_name].widget = widget
© www.soinside.com 2019 - 2024. All rights reserved.