Значение поля не заполняется, кроме случаев отладки
У меня странная проблема, когда обычно переменная field_val
должна быть установлена в какое-то определенное значение, но она устанавливается в "". Когда я отлаживаю в vscode и смотрю на значение из отладчика, осматривая его (возможно, вызывая что-то), переменная внезапно становится доступной. Когда я не отлаживаю, значение - пустая строка. Я не могу понять, что здесь происходит. Есть ли какая-то ленивая оценка, которую я упускаю в формах django?
Я пытаюсь сохранить отправленное значение в datalist, когда отправка формы не удалась. Пытаюсь взять это значение из self.instance
, который является экземпляром моей модели django db basically.
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 datalist будет заполнено, когда:
- отправка формы не удалась из-за недопустимых данных,
- если экземпляр уже имеет значение,
- устанавливает значение в "", если поле None (иначе оно отображается как "None" в списке данных).
А 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