我遇到了一个奇怪的问题,通常
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)),
),
)
我无法理解这里发生了什么,但最终我从
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