Django文檔提到模型AutoField不會在使用ModelForm構建的表單中表示。如何使用Django AutoField編輯modelForm?
編輯和保存表單時,我應該如何知道底層的AutoField ID值以正確保存我的表單數據到數據庫?
我知道我可以注入一個隱藏字段的編輯表單,以知道哪一行已被編輯,但是有沒有辦法Django自動管理隱藏字段或其他機制?
非常感謝
艾蒂安
Django文檔提到模型AutoField不會在使用ModelForm構建的表單中表示。如何使用Django AutoField編輯modelForm?
編輯和保存表單時,我應該如何知道底層的AutoField ID值以正確保存我的表單數據到數據庫?
我知道我可以注入一個隱藏字段的編輯表單,以知道哪一行已被編輯,但是有沒有辦法Django自動管理隱藏字段或其他機制?
非常感謝
艾蒂安
你做到這一點通過指定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
字段。
通常當你正在編輯的形式,要編輯會在你的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)
...
除了formset的情況,其中主鍵通常在表單本身中指定。 –
@LieRyan:真的,但OP沒有提到使用窗體集 – hellsgate
好吧,但我很想知道是否有一種簡單的方法使AutoField像其他字段一樣管理(隱藏或不隱藏),而不是必須像你一樣在url中管理它? –
我知道實例參數,但你如何獲得你的ID = 1,如果它不是在請求中來嗎?這正是我的問題 –
您正在初始化要編輯的對象的實例。不知何故,你已經有權訪問了嗎?我的例子只是假設你有它,但你可以將它作爲URL參數傳遞,並在視圖中訪問它。剛編輯答案。希望更有意義。 – karthikr
好的,但我很想知道是否有一種簡單的方法可以使AutoField像其他字段一樣進行管理(隱藏或不隱藏),並且不必像在URL中那樣管理它。 –