Заполнение поля 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