У меня есть форма Django с ChoiceField, использующая динамически генерируемые варианты.Movie_dict_list генерируется API (themoivedb), когда для поиска отправляется другая форма с названием фильма.Затем Movie_dict_list передается MovieChoiceForm в качестве kwarg во время инициализации и используется для создания списка выбора.
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')
Проблема возникает при проверке формы путем вызова .is_valid () для новой формы, созданной из данных request.POST.Поскольку новая форма не передает ранее сгенерированный movie_dict_list в качестве аргумента ключевого слова, она не имеет того же списка вариантов выбора (его единственный выбор должен быть Нет) для проверки и возвращает ошибку
"Выберите правильный вариант. {'Title': 'Star Wars', 'release_year': '1977', 'id': 11} не является одним из доступных вариантов."
TheЕдинственное, о чем я могу думать, - это снова запросить API базы данных фильмов, чтобы получить еще одну копию movie_dict_list, но это не похоже на отличное решение.Прямо сейчас поиск и выбор - это разные формы, поэтому мне придется объединять их, проверять только заголовок поиска, запрашивать API, если заголовок поиска действителен, а затем проверять выбор.И даже если бы все это работало, я удваиваю свои поисковые запросы API к базе данных фильмов.
У кого-нибудь есть элегантное решение?