使用外部数据填充 Django 模板中的 ChoiceField

Fill a ChoiceField in Django template with external data

我是 Django 的新手,我很难理解 forms 当要选择的数据不是从数据库中获取的,也不是用户输入的随时随地生成。

我目前有一个模板只有一个 ChoiceField此字段中的数据不是固定的,它们是在请求页面后随时计算的。要计算它,我需要登录用户的用户名。基本上,计算 returns ((title, id),(title,id),(title,id)) 等形式的列表列表,我需要将其放入 ChoiceField 以使用户从其中一个选项中进行选择。

现在,我不明白如何将计算出的列表列表传递给表单。我试过如下在表格中添加计算,但这显然是错误的方法。

主要问题是,要计算我的列表列表,我需要 request 值,但我不知道如何从表单访问它。

另一个想法是在 init 中添加 generate_selection 函数,但我不知道如何将 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