Значение поля не заполняется, кроме случаев отладки

У меня странная проблема, когда обычно переменная 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)),
            ),
        )

Реальный быстрый гиф, объясняющий мою проблему: issue_gif

Я не мог понять, что здесь происходит, но в итоге я получаю значение поля из 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
Вернуться на верх