Настройте/удалите опцию пробела поля выбора Django

кажется, что работает следующее решение: извлеките сценарий точки входа в файл сценария .sh.

Когда вы запустите свой контейнер, переменные окружения получат значения по умолчанию, если они не настроены в файле .env.

новый скрипт может использовать параметры напрямую, а значения существуют.

Я не уверен, почему это поведение, но это, вероятно, что-то в порядке загрузки каждого раздела docker-compose.

73
задан 5 revs, 2 users 100% 12 April 2009 в 03:04
поделиться

4 ответа

Не проверял это, но на основе чтения кода Джанго здесь и здесь Я считаю, что это должно работать:

class ThingForm(models.ModelForm):
  class Meta:
    model = Thing

  def __init__(self, *args, **kwargs):
    super(ThingForm, self).__init__(*args, **kwargs)
    self.fields['verb'].empty_label = None

РЕДАКТИРОВАТЬ : это задокументировано , хотя вы не обязательно будете искать ModelChoiceField, если работаете с автоматически сгенерированной ModelForm.

РЕДАКТИРОВАТЬ : как jlpp отмечает в своем ответе, это не завершено - вы должны переназначить выбор для виджетов после изменения атрибута empty_label. Поскольку это немного странно, другой вариант, который легче понять, это просто переопределить весь ModelChoiceField:

class ThingForm(models.ModelForm):
  verb = ModelChoiceField(Verb.objects.all(), empty_label=None)

  class Meta:
    model = Thing
87
ответ дан Carl Meyer 24 November 2019 в 12:10
поделиться

из документов

Пустой выбор не будет включен если поле модели имеет пустое значение = False и явное значение по умолчанию (по умолчанию значение будет изначально выбрано вместо этого).

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

35
ответ дан zalew 24 November 2019 в 12:10
поделиться

С ответом Карла в качестве руководства и после того, как я в течение нескольких часов копался в источнике Джанго, я думаю, что это полное решение:

  1. Чтобы удалить пустую опцию (расширяя пример Карла):

     class ThingForm (models.ModelForm):
     Класс Meta:
     модель = вещь
    
     def __init __ (self, * args, ** kwargs):
     супер (ThingForm, self) .__ init __ (* args, ** kwargs)
     self.fields ['verb']. empty_label = Нет
     # следующая строка необходима для обновления копии виджета списка выбора
     self.fields ['verb']. widget.choices =
     self.fields [ 'глагол']. выбор
    
  2. Чтобы настроить пустую метку опции, по сути, то же самое:

     class ThingForm (models.ModelForm):
     Класс Meta:
     модель = вещь
    
     def __init __ (self, * args, ** kwargs):
     супер (ThingForm, self) .__ init __ (* args, ** kwargs)
     self.fields ['verb']. empty_label = "Выбрать глагол"
     # следующая строка необходима для обновления копии виджета списка выбора
     self.fields ['verb']. widget.choices =
     self.fields [ 'глагол']. выбор
    

Я думаю, что этот подход применим ко всем сценариям, где ModelChoiceFields отображаются как HTML, но я не уверен. Я обнаружил, что когда эти поля инициализируются, их выбор передается виджету выбора (см. Django.forms.fields.ChoiceField._set_choices). Установка empty_label после инициализации не обновляет список вариантов выбора виджета. Я недостаточно знаком с Джанго, чтобы понять, следует ли это считать ошибкой.

22
ответ дан jlpp 24 November 2019 в 12:10
поделиться

См. здесь для полного обсуждения и методов решения этой проблемы.

5
ответ дан 24 November 2019 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: