Вы можете изменить выбор любого поля выбора в init.
Учитывайте это
class BookForm(forms.Form):
book = forms.ModelChoiceField(queryset=Book.objects.all())
user = forms.EmailField()
def __init__(self, author=None, *args, **kwargs):
super(CheckoutForm, self).__init__(*args, **kwargs)
if author:
self.fields['book'].queryset = Book.objects.filter(author__icontains=author)
В этом примере вы можете вызывать BookForm () как обычно, или вы можете вызывать BookForm(author = "Tolkien")
Таким образом, вы бы могли изменить ModelChoices на лету, как вы могли заметить, это тот же процесс, что и для изменения обычного выбора на лету, просто пройти итерацию (обычно 2кортежи)