如何验证具有动态生成的选项的Django表单choicefield?

时间:2019-05-07 17:06:26

标签: django validation dynamically-generated choicefield

我有一个使用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搜索查询也要加倍。

有人有一个优雅的解决方案吗?

0 个答案:

没有答案