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

时间:2011-05-30 18:40:03

标签: django google-app-engine django-forms

我在Google App Engine中有一个带有ChoiceField的Django ModelForm,让我们说位置:

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_valid()。有没有办法在对象实例化期间抑制验证?或者其他一些方法来解决这个问题?

更新:我非常确定ModelFormMetaclass通过在创建表单时验证提供的实例来让我感到悲伤。仍不确定如何修复。

谢谢!

1 个答案:

答案 0 :(得分:3)

必须有其他方法可以做到这一点,但最简单的方法是在表单的__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},)

告诉我们这对您有何帮助。