Не удается проверить динамический выбор с Django ModelForm - PullRequest
1 голос
/ 30 мая 2011

У меня есть Django ModelForm в Google App Engine с ChoiceField, скажем, местоположение:

class MyForm(ModelForm):
    location = ChoiceField(label="Location")

    class Meta:
        model = MyModel

Чтобы динамически добавлять варианты выбора местоположения и не было проблем с кэшированием приложения, я добавляю их после инициализации формы:

form = MyForm(request.POST, instance=my_instance)
form.fields['location'].choices = Location.all().fetch(1000)

Проблема, с которой я столкнулся сейчас, заключается в том, что когда форма инициализируется с помощью данных в запросе. POST выбора еще не существует, и я получаю сообщение об ошибке, в котором говорится, что сделан неверный выбор (поскольку значение еще не выполнено) существует в списке вариантов).

Мне не нравится, что проверка происходит, когда я инициализирую форму, а не жду, пока я вызову form.is_valid (). Есть ли способ подавить проверку во время создания объекта? Или каким-то другим способом это исправить?

ОБНОВЛЕНИЕ: Я почти уверен, что ModelFormMetaclass вызывает у меня горе, проверяя предоставленный экземпляр при создании формы. Все еще не уверен, как это исправить.

Спасибо!

1 Ответ

3 голосов
/ 31 мая 2011

Должны быть другие способы сделать это, но, возможно, самый простой - это добавить поле в метод __init__() формы:

class MyForm(ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        try:
            dynamic_choices = kwargs.pop('dynamic_choices')
        except KeyError:
            dynamic_choices = None # if normal form
        super(MyForm, self).__init__(*args, **kwargs)
        if dynamic_choices is not None:
            self.fields['location'] = ModelChoiceField(
                                          queryset=dynamic_choices)
    class Meta:
        model = MyModel

И ваше представление будет выглядеть примерно так:

def my_view(request):
    locations = Location.objects.all() # or filter(...) or whatever
    dynamic_form = MyForm(dynamic_choices=locations)

    return direct_to_template(request, 
                              'some_page.html',
                              {'form': dynamic_form},)

Дайте нам знать, как это работает для вас.

...