Заполните поле формы Django вариантами из базы данных (но не из модели) - PullRequest
1 голос
/ 06 июня 2019

Я хотел бы заполнить раскрывающийся список форм данными из базы данных. Эти данные поступают не из модели, а из необработанного запроса.

Это работает, когда база данных доступна и миграции уже созданы. В противном случае генерирование миграций (python manage.py makemigrations myapp) завершится неудачно, потому что Django оценивает _all_departments(), который не может найти соответствующую таблицу.

def _all_departments() -> List[Tuple[str, str]]:
    from django.db import connection
    with connection.cursor() as cursor:
        cursor.execute("select distinct department from crm_mytable order by department")
        return [(row[0], row[0]) for row in cursor.fetchall()]


class MyForm(forms.Form):
    department = forms.CharField(
        widget=forms.SelectMultiple(choices=_all_departments()))

Я наивно пытался обновить варианты вручную на __init__ безуспешно (варианты всегда пусты):

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['department'].widget.choices = _all_departments()

    department = forms.CharField(
        widget=forms.SelectMultiple(choices=[]))

Каким образом можно правильно заполнить выбор по требованию?

1 Ответ

2 голосов
/ 06 июня 2019

Вы должны не передавать choices в виджет , а в поле .Кроме того, вы, вероятно, хотите использовать MultipleChoiceField [Django-doc] , для этого используется SelectMultiple [Django-doc] как виджет по умолчанию:

class MyForm(forms.Form):

    department = forms.<b>MultipleChoiceField(choices=[])</b>

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['department']<b>.choices</b> = _all_departments()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...