Заполнение поля ChoiceField в шаблоне Django внешними данными

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

В настоящее время у меня есть шаблон с одним полем ChoiceField. Данные в этом поле не фиксированы и вычисляются на ходу, как только страница запрашивается. Для вычисления мне нужно имя пользователя, который вошел в систему. По сути, расчет возвращает список списков в форме ((title, id),(title,id),(title,id)) и т.д., которые мне нужно поместить в поле ChoiceField, чтобы заставить пользователя выбрать один из вариантов.

Теперь я не понимаю, как передать вычисленный список списков в форму. Я пытался добавить вычисления внутри формы, как показано ниже, но это явно неправильный путь.

Главная проблема в том, что для вычисления списка списков мне нужно значение request, и я не знаю, как получить к нему доступ из формы.

Другой идеей было добавить функцию generate_selection внутри init, но тогда я не знаю, как передать main_playlist, чтобы иметь возможность добавить ее в ChoiceField

Ниже мой не работает forms.py

forms.py

class ChoosePlaylistForm(forms.Form):

    playlists = forms.ChoiceField(choices=HERE_SHOULD_GO_main_playlist)

    def generate_selection(self):
        sp_auth, cache_handler = spotify_oauth2(self.request)
        spotify = spotipy.Spotify(oauth_manager=sp_auth)
        user_playlists = spotify.current_user_playlists(limit=10)

        main_playlist = []
        for playlists in user_playlists["items"]:
            playlists_list = []

            playlists_list.append(playlists['name'])
            playlists_list.append(playlists['id'])
            main_playlist.append(playlists_list)

        return main_playlist

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(ChoosePlaylistForm, self).__init__(*args, **kwargs)

    class Meta:
        model = User
        fields = ('playlists',)

Представления должны быть примерно такими, как показано ниже, чтобы я мог передать запрос

views.py

form = ChoosePlaylistForm(request=request)

Возможно, переопределение выбора полей в конструкторе формы будет работать:

class ChoosePlaylistForm(forms.Form):
    playlists = forms.ChoiceField(choices=())

    class Meta:
        model = User
        fields = ('playlists',)

    def __init__(self, *args, request=None, **kwargs):
        super(ChoosePlaylistForm, self).__init__(*args, **kwargs)
        self.request = request
        self.fields['playlists'].choices = self.generate_selection()

    def generate_selection(self):
        sp_auth, cache_handler = spotify_oauth2(self.request)
        spotify = spotipy.Spotify(oauth_manager=sp_auth)
        user_playlists = spotify.current_user_playlists(limit=10)

        choices = []
        for playlist in user_playlists["items"]:
            playlist_choice = (playlist["name"], playlist["id"])
            choices.append(playlist_choice)

        return choices
Вернуться на верх