2016-09-02 33 views
0

用戶點擊一個按鈕,通過一個包含pk的POST請求將它們帶到一個新表單中。這是用來預先填充新的表單與一些額外的數據。此時沒有數據保存到數據庫。我不想通過URL傳遞這個PK,所以無法使用GET調用視圖。如何使用POST(而不是GET)設置CreateView視圖的初始表單值?

我試着重寫CreateView中的get_initial()方法,但是這似乎只在GET請求後調用。

我也試過def post(),它讓我能夠輕鬆訪問字段,但意味着我必須編寫更多代碼來處理表單驗證等(這是由vanilla CreateView自動處理的)。

那麼,當兩個請求都通過POST進行處理時,處理表單的保存和渲染的最佳方式是什麼?

+1

這是一個奇怪的要求。爲什麼不能使用GET顯示錶單?這是正常模式; POST用於進行更改,不顯示數據。 –

+0

形式是爲寵物主人和他/她的寵物預約。我想預先填寫擁有者和寵物名稱的表單。我不能簡單地通過所有者的PK,因爲不是所有的寵物都會在預約中,而且我不能只是通過寵物PK,因爲可能有多於一個。 –

+0

..使用POST我可以通過一個寵物PK列表。不知道如何通過GET乾淨地做到這一點。 –

回答

0

我會做什麼:

def post(self, request, **kwargs): 
    # Replace 'list_of_pets' with stuff that you'll definitely have in the first request 
    if 'list_of_pets' in request.POST: 
     # Provide initial data for form in get() 
     return self.get(request, **kwargs) 
    else: 
     # Provides automatic form validation 
     return super().post(request, **kwargs) 

get()方法,你可以設置初始數據和諸如此類的東西。您也可以使用完全獨立的方法,但覆蓋get()會給您帶來的好處,即如果有人在沒有POST請求的情況下漫遊到URL,他們不會立即得到討厭的405(當然,還有其他方法可以避免它, 只是在說')。