Для формы вы должны , а не использовать ModelChoiceField
[Django-doc] . В самом деле, вы не выбираете объект модели, а значение. Таким образом, вместо этого вы должны использовать ChoiceField
[Django-doc] .
Что касается параметров, я думаю, что вы хотите использовать CONFIRMATION_CHOICES
, поскольку, используя набор запросов, вы запрашиваете базу данных, и, таким образом, вы можете выбрать только income_proof
s, которые уже выбраны other записей.
from app.models import <b>CONFIRMATION_CHOICES</b>
from django import forms
class MyForm(forms.ModelForm):
income_proof = forms.<b>ChoiceField</b>(
<b>choices</b>=<b>CONFIRMATION_CHOICES</b>,
widget=forms.Select(
attrs={'class': 'selectpicker form-control', 'title':_('Income proof')}
)
)
или, если вы хотите только те значения, которые были выбраны, вы можете использовать:
from app.models import CONFIRMATION_CHOICES
from django import forms
class MyForm(forms.ModelForm):
income_proof = forms.<b>ChoiceField</b>(
choices=[],
widget=forms.Select(
attrs={'class': 'selectpicker form-control', 'title':_('Income proof')}
)
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
render = dict(CONFIRMATION_CHOICES)
self.fields['income_proof'].choices = [
<b>(k, render.get(k, k))</b>
for k in CreditPayment.objects.values_list('income_proof', flat=True).distinct()
]
Здесь __init__
вызывается, когда мы создаем форму. Сначала мы позволим супер-конструктору выполнить работу по созданию полей, а затем создадим словарь из CONFIRMATION_CHOICES
.
Затем мы выполняем запрос (тот же, который вы использовали), чтобы получить значения базы данных для income_proof
, и мы используем словарь для сопоставления их с соответствующими переводами. Таким образом, мы получаем список из двух кортежей в качестве выбора для этого поля формы.
Здесь мы используем параметр choices=
[Django-doc] , который должен содержать:
choices
Либо итерация из 2-х кортежей для использования в качестве выбора для этого поля, либо
вызываемый, который возвращает такой итеративный. Этот аргумент принимает то же самое
форматирует как аргумент choices
для поля модели. Посмотреть модель
полевая справочная документация по выбору для более подробной информации. Если
Аргумент является вызываемым, он оценивается каждый раз, когда форма поля
инициализируется. По умолчанию используется пустой список.