我有一个使用ChoiceField的Django表单,该表单使用了动态生成的选择。当提交另一个带有电影标题的表单以进行搜索时,API(themoivedb)会生成movie_dict_list。然后将Movie_dict_list作为kwarg传递给MovieChoiceForm,并用于创建选项列表。
class MovieChoiceForm(forms.Form):
def __init__(self, *args, **kwargs):
#Generate choices
if 'movie_dict_list' in kwargs:
movie_dict_list = kwargs.pop('movie_dict_list')
if movie_dict_list:
movie_choice_list = [(
movie_dict,
"{} ({})".format(movie_dict['title'], movie_dict['release_year']),
) for movie_dict in movie_dict_list]
else:
movie_choice_list = [(None, 'No Results')]
else:
movie_choice_list = [(None, 'No Results')]
super(MovieChoiceForm, self).__init__(*args, **kwargs)
#create field
self.fields['select_movie'] = forms.ChoiceField(required=False,
choices=movie_choice_list, widget=forms.Select, label='Select Result')
通过在从request.POST数据实例化的新表单上调用.is_valid()来验证表单时,会出现问题。由于新表单未通过先前生成的movie_dict_list作为关键字参数传递,因此它没有相同的选项列表(唯一的选择应为None)进行验证并返回错误
“选择有效的选择。{'title':'Star Wars','release_year':'1977','id':11}不是可用的选择。”
我唯一想到的是再次查询电影数据库API以获取movie_dict_list的另一个副本,但这听起来不是一个很好的解决方案。现在,搜索和选择是不同的形式,因此,我必须将它们组合在一起,仅验证搜索标题,如果搜索标题有效,则查询API,然后验证选择。即使所有方法都能奏效,我的电影数据库API搜索查询也要加倍。
有人有一个优雅的解决方案吗?