Действительно ли возможно установить queryset поля ForeignKey формы так, чтобы это взяло отдельный queryset's и произвело их в <optgroup>
?
Вот то, что я имею:
views.py
form = TemplateFormBasic(initial={'template': digest.template.id})
form.fields['template'].queryset = Template.objects.filter(Q(default=1) | Q(user=request.user)).order_by('name')
В моей модели Template у меня есть Шаблоны по умолчанию и созданные Пользователями шаблоны. Я хочу, чтобы они были явно разделены в <select>
поле, например.
<select>
<optgroup label="Default Templates">
<option>Default 1</option>
<option>Default 2</option>
</optgroup>
<optgroup label="User Templates">
<option>User Template 1</option>
<option>User Template 2</option>
</optgroup>
</select>
Это может быть сделано?
Я смог понять это, используя пример, приведенный в этом блоге
views.py
form.fields['template'].choices = templates_as_choices(request)
def templates_as_choices(request):
templates = []
default = []
user = []
for template in Template.objects.filter(default=1).order_by('name'):
default.append([template.id, template.name])
for template in Template.objects.filter(user=request.user).order_by('name'):
user.append([template.id, template.name])
templates.append(['Default Templates', default])
templates.append(['User Templates', user])
return templates
Раньше я использовал не внешний ключ в форме, а charfield с вариантами выбора .
CharField с вариантами выбора поддерживает optgroups. У вас должен быть выбор в следующем формате:
('Группа 1', (('1', 'Яда'), ('2', 'Яда'))), ('Группа 2', (( '3', 'Bepety'), ('4', 'Bopity')))
Выборы также могут быть вызываемыми. Поэтому я создал свою собственную функцию, которая просматривает модели и строит кортеж, как показано выше.