无法使用Django ModelForm验证动态选择

无法使用Django ModelForm验证动态选择,django,google-app-engine,django-forms,Django,Google App Engine,Django Forms,我在Google App Engine中有一个Django模型表单,其中有一个ChoiceField,比如位置: class MyForm(ModelForm): location = ChoiceField(label="Location") class Meta: model = MyModel 为了动态添加位置选项,并且不会出现应用程序缓存问题,我在表单初始化后添加它们: form = MyForm(request.POST, instance=my_i

我在Google App Engine中有一个Django模型表单,其中有一个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)
我现在遇到的问题是,当表单通过request.POST中的数据进行初始化时,选项还不存在,并且我收到一个错误,指出做出了无效的选择(因为该值在选项列表中还不存在)

我不喜欢在初始化表单时进行验证,而不是等到调用form.is\u valid()时才进行验证。在我的对象实例化过程中,有什么方法可以抑制验证吗?或者其他方法来解决这个问题

更新:我很确定ModelFormMetaclass在创建表单时验证了提供的实例,这让我很伤心。但仍然不确定如何修复


谢谢

必须有其他方法来实现这一点,但最简单的方法可能是在表单的
\uuuu init\uuuu()方法中添加字段:

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},)

让我们知道这对您是如何起作用的。

嘿,Adam,我曾尝试在init中添加选项,但没有成功,但是我没有尝试在那里声明字段。不过它似乎很有效,所以谢谢你的建议!