2011-05-30 83 views
1

我有一个Django的ModelForm在谷歌应用程序引擎与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的数据初始化的选择还不存在,我收到了一条错误,指出无效的选择(自价值e在选择列表中还不存在)。

我不喜欢在初始化表单时发生验证,而不是等到我调用form.is_valid()。有没有办法在我的对象实例化过程中抑制验证?或者以其他方式解决这个问题?

更新:我很确定ModelFormMetaclass通过在创建表单时验证提供的实例而使我感到悲伤。仍然不知道如何解决。

谢谢!

回答

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

让我们知道如何为你工作。

+0

嘿亚当,我试图在__init__中添加选项但没有成功,但是我没有尝试在那里声明字段。它似乎工作,尽管如此感谢您的建议! – 2011-05-31 15:22:29