我正在使用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)
在HTML表單的背景下思考它,他們永遠不會發送部分表單的事實是有道理的。關於領域動態設置的好主意。我會玩弄它。謝謝! – fildred13