@Bjornie
Изучаю Python

Как передать элементы кортежа в ModelChoiceField?

Мучаюсь с этим уже два часа и не понимаю как передать список в форму, чтобы id было значением option value, а name названием пункта в выпадающем меню.

Код forms.py:
from django import forms
from .models import Names


class SearchNamesForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(SearchNamesForm, self).__init__(*args, **kwargs)
        self.fields['selectName'].empty_label = "..."
        self.fields['selectName'].widget.attrs['class'] = 'searchform-main__select'
        self.fields['selectName'].queryset = Names.objects.all().values_list('id', 'name')

    selectName = forms.ModelChoiceField(
        required=False,
        widget=forms.Select,
        queryset=Names.objects.none()
    )


Сейчас он возвращает мне:
<option value="(1, &#39;Вася)">(1, &#39;Вася)</option>
<option value="(2, &#39;Петя)">(2, &#39;Петя)</option>


И ставит их как в option=value так и в его имя.

Перед этим намучался с queryset и значением по умолчанию empty_label, но вроде сейчас работает, и хочу понять как расставить кортеж на свои места
<option value="1">Вася</option>
<option value="2">Петя</option>


В шаблоне вывожу сразу форму {{ form }}
  • Вопрос задан
  • 433 просмотра
Пригласить эксперта
Ответы на вопрос 1
chewarer
@chewarer
Вчера точно такая же задача была.

from django import forms
from models import sentry_user

# переопределяем класс
class MyChoice(forms.ModelChoiceField):
	def label_from_instance(self, obj):
		return obj.full_name # Название поля которое нужно отображать в списке

# собственно форма
class Myform(forms.ModelForm):
	worker = MyChoice(
		queryset=sentry_user.objects.filter(is_active=1).all(),
		empty_label='Все',
		widget=forms.Select(attrs={'class': 'dropdown'}), required=False, label='Сотрудник')

	class Meta:
		model = sentry_user
		fields = ('worker')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы