Вот один вариант; см. комментарии в коде.
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>
Виджеты формы 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)
Кажется, что 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'),
])
Это, по моему скромному мнению - необходимая вещь.
Вы пытаетесь создать меню, в котором элементы списка разделены на категории, и Вы не хотите, чтобы сами категории можно выбрать?
Если так, можно достигнуть этого при наличии шаблонного рендеринга поле с помощью тегов, например.
<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>