2011-05-30 100 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