使用外部数据填充 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
我是 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