2016-06-09 36 views
0

我正在使用Django REST框架開發API。我的一個API端點接受以下POST請求:Django表單驗證未知字符串列表

{ 
    "tokens": ["biemnxci92j3kd", "xjcivjd23djcisd"], 
    ... 
} 

我想用Django的形式來驗證這個請求的參數。這是我目前的形式:

class TestForm(forms.Form): 
    processors = forms.MultipleChoiceField() 
    # other stuff 
    ... 

我的問題是,MultipleChoiceField要求我提供接受選擇的名單,但我接受字符串具有隨機值,我不事先知道它們的值。因此驗證此表單總是給我一個錯誤。我想到了幾種可能的解決方案,但它們都沒有效果:

  1. 使用另一個表單域 - 我無法找到可用於表示(和驗證)一個字符串列表的另一個域。
  2. 創建我自己的自定義驗證器 - 這在某種程度上仍然要求我事先將該字段定義爲多選字段,我不知道如何創建我自己的自定義字符串列表字段。

有什麼建議?

回答

1

由於它是一個API,您可能甚至不需要使用{{ form }}呈現表單,所以您可以完全刪除該字段,擴展clean方法並直接驗證數據。

class TestForm(forms.Form): 

    def clean(self): 
     super(TestForm, self).clean() 

     if 'tokens' in self.data: 
      if your_logic_to_validate() is False: 
       raise forms.ValidationError('Invalid tokens') 

     return self.cleaned_data 

即使你需要渲染的形式,你只想渲染HTML自己而不是依靠{{ form }}{{ form.tokens }}。你應該能夠循環form.data.tokens來構建一個多重選擇並將它們全部設置爲選中(或者如果沒有數據被綁定,則不提供選項)。