2013-10-10 33 views
0

Django文檔提到模型AutoField不會在使用ModelForm構建的表單中表示。如何使用Django AutoField編輯modelForm?

編輯和保存表單時,我應該如何知道底層的AutoField ID值以正確保存我的表單數據到數據庫?

我知道我可以注入一個隱藏字段的編輯表單,以知道哪一行已被編輯,但是有沒有辦法Django自動管理隱藏字段或其他機制?

非常感謝

艾蒂安

回答

3

你做到這一點通過指定instance=<>參數當您使用ModelForm。 更多內容在創建/更新視圖的documentation here

用法示例:

def myview(request, id=None): 
    if id: 
     obj_to_edit = MyModel.objects.get(id=1) 
     form = MyForm(instance=obj_to_edit) 
    else: 
     obj_to_edit = None 
     form = MyForm() 

    if request.method == 'POST': 
     if id: #update 
      form = MyForm(request.POST, instance=obj_to_edit) 
     else: #create 
      form = MyForm(request.POST) 

    #rest of the code 

和URL會碰到這樣的:

url(r'/blah/create/', 'myview'), 
url(r'/blah/edit/(?P<id>[\d+])/', 'myview') 

現在,Django的理解,它需要編輯而不是創建新的對象。

另請注意,如果您使用的是forms.Form,則必須手動查詢唯一字段,或者如上所述注入隱藏的id字段。

+0

我知道實例參數,但你如何獲得你的ID = 1,如果它不是在請求中來嗎?這正是我的問題 –

+0

您正在初始化要編輯的對象的實例。不知何故,你已經有權訪問了嗎?我的例子只是假設你有它,但你可以將它作爲URL參數傳遞,並在視圖中訪問它。剛編輯答案。希望更有意義。 – karthikr

+0

好的,但我很想知道是否有一種簡單的方法可以使AutoField像其他字段一樣進行管理(隱藏或不隱藏),並且不必像在URL中那樣管理它。 –

2

通常當你正在編輯的形式,要編輯會在你的URL中使用無論是主鍵或蛞蝓領域,如識別特定實例:

www.example.com/model/edit/6/ 

www.example.com/model/edit/object_slug/ 

你可以這樣設置你的urls.py給該參數傳遞到您的視圖,在那裏你會使用由karthkir提供的例子(我將使用主要的例子在這裏)

urls.py

urlpatterns = patterns('', 
    url(regex=r'^model/edit/(?P<pk>\d+)/$', 'myapp.views.myview', name='add_customer'), 
) 

views.py

def myview(request, pk): 
    obj_to_edit = MyModel.objects.get(id=pk) 
    ... 
+0

除了formset的情況,其中主鍵通常在表單本身中指定。 –

+0

@LieRyan:真的,但OP沒有提到使用窗體集 – hellsgate

+0

好吧,但我很想知道是否有一種簡單的方法使AutoField像其他字段一樣管理(隱藏或不隱藏),而不是必須像你一樣在url中管理它? –