2017-10-13 23 views
0

我正在使用Django的窗體來驗證API PATCH請求。在「視圖」(我在引號中使用,因爲它不直接是一個視圖,它是一個不安分的Resource,但這應該是無關的),它處理這個補丁請求,self.data包含一些字典License對象的字段。我想用要更改的對象的實例來實例化ModelForm。顯然,我誤解了這是如何工作的。請看下圖:Django ModelForm'實例'參數不按預期工作

def handle_patch(self, pk): 
    license = License.objects.get(id=pk) 

    form = LicenseResourceForm(self.data, instance=license) 

    if not form.is_valid(): 
     print(form.errors) 

如果我通過幾個字段作爲數據發送到上述功能,form.errors抱怨的License模型的所有其他必填字段,這意味着我顯然沒有理解如何在ModelForm著作實例。

我增加了一些調試打印到Django的ModelForm代碼本身在clean()法,因爲它開始做清潔過程中,我可以看到self.instance被填充的License實例,我希望,這讓我困惑 - ModelForm對象知道該實例,但不用它來「填空」。

那麼我誤解了什麼?我一定是做錯了。

編輯我知道有些人可能想看看LicenseResourceForm本身,所以這裏是,包括我的調試打印:

class LicenseResourceForm(ModelForm): 
    """Form for License Resource create and change endpoints.""" 
    class Meta(object): 
     model = License 
     fields = ['customer', 'service', 'enabled', 'not_valid_before', 'not_valid_after'] 

    def clean(self): 
     try: 
      print(self.instance) 
      super().clean() 
     except Exception as e: 
      print(e) 

回答

1

Django表單並不意味着API使用和Don」理解PATCH語義。它們是用於用戶在Web表單中輸入或更改數據的工作流程,它將始終將所有數據發佈到後端。因此,將根據數據檢查表單中fields屬性中列出的所有字段,並將任何缺失的字段驗證爲空白。

您可以通過巧妙地根據提供的數據動態設置字段列表來解決這個問題,但實際上您應該使用適當的工具來驗證您的數據。我不知道坐立不安,但django-rest-framework有序列化程序可用於此目的。

+0

在HTML表單的背景下思考它,他們永遠不會發送部分表單的事實是有道理的。關於領域動態設置的好主意。我會玩弄它。謝謝! – fildred13