Опция “Disabled” для choiceField - Django

Вот один вариант; см. комментарии в коде.

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> with
  2  -- this mimics SYSDATE
  3  today (datum) as
  4    (select date '&date_literal' from dual),
  5  -- which quarter does DATUM belong to? Find 1st day in "this" and "previous" year
  6  quart as
  7    (select trunc(datum, 'yyyy') this,
  8            trunc(add_months(datum, -12), 'yyyy') previous,
  9            to_char(datum, 'q') quart from today)
 10  -- the fina result
 11  select add_months(this, (level - 1) * 3) result
 12  from quart
 13  connect by level <= quart
 14  union all
 15  select add_months(previous, (level - 1) * 3) result
 16  from quart
 17  connect by level <= quart;
Enter value for date_literal: 2019-03-24

RESULT
----------
01.01.2019
01.01.2018

SQL> /
Enter value for date_literal: 2019-08-13

RESULT
----------
01.01.2019
01.04.2019
01.07.2019
01.01.2018
01.04.2018
01.07.2018

6 rows selected.

SQL>
21
задан Pierre 23 March 2009 в 12:30
поделиться

3 ответа

Виджеты формы Django предлагают способ передать список атрибутов, которые должны быть представлены на <option> тег:

my_choices = ( ('one', 'One'), ('two', 'Two'))
class MyForm(forms.Form):
    some_field = forms.ChoiceField(choices=my_choices, 
                                   widget=forms.Select(attrs={'disabled':'disabled'}))

К сожалению, это не будет работать на Вас, потому что атрибут будет применен к КАЖДОМУ тегу опций, который представляется. У Django нет способа автоматически знать, который должен быть включен и который должен быть отключен.

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

  • подкласс forms.Select, который является избранным рендерером по умолчанию
  • в Вашем подклассе реализуйте render(self, name, value, attrs) метод. Используйте свою пользовательскую логику, чтобы определить если value квалифицирует как бывший должный быть отключенным. Взгляните на очень короткую реализацию render в django/forms/widgets.py если Вам нужно вдохновение.

Затем определите свое поле формы для использования пользовательского виджета:

class MyForm(forms.Form):
    some_field = forms.ChoiceField(choices=my_choices, 
                                   widget=MyWidget)
21
ответ дан 29 November 2019 в 20:39
поделиться

Кажется, что django 1.1 позволит "optgroup": документация Django

class MyForm(forms.Form):
    some_field = forms.ChoiceField(choices=[
        ('Audio', (
                ('vinyl', 'Vinyl'),
                ('cd', 'CD'),
            )
        ),
        ('Video', (
                ('vhs', 'VHS Tape'),
                ('dvd', 'DVD'),
            )
        ),
        ('unknown', 'Unknown'),
    ])

Это, по моему скромному мнению - необходимая вещь.

4
ответ дан 29 November 2019 в 20:39
поделиться

Вы пытаетесь создать меню, в котором элементы списка разделены на категории, и Вы не хотите, чтобы сами категории можно выбрать?

Если так, можно достигнуть этого при наличии шаблонного рендеринга поле с помощью тегов, например.

<select name="my_field" id="id_my_field">
<optgroup label="-- Root 1 entry --">
    <option value="1">Elt 1</option>
    <option value="2">Elt 2</option>
    <option value="3">Elt 3</option>
</optgroup>
<optgroup label="--- Root 2 entry ---">
    <option value="4">Elt 4</option>
    <option value="5">Elt 5</option>
</optgroup>
</select>
3
ответ дан 29 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

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