2010-09-06 40 views
3

我有一個複雜的Django對象,它具有其他類類型的屬性。這得到這樣的:Django模型表單和對象數據庫ID

class Order: 
    contractor - type Person 
    some other fields.... 

在我的形式,我想能夠無論是從下拉列表中選擇現有的Person對象或添加一個成一個新的。我已經設法創建表單和適當的工作流程,但問題在於保存訂單本身,我根本無法獲取保存的Person實例的ID。我做某事這樣的:

def make_order(request): 
    if request.method == 'POST': 
    parameters = copy.copy(request.POST) 
    contractor_form = ContractorForm(parameters) 
    if contractor_form.is_valid(): 
     contractor_form.save() 
     parameters['contractor'] = ??? 
    form = OrderForm(parameters) 
    if form.is_valid(): 
     form.save() 
     return HttpResponseRedirect('/orders/') 
    else: 
    form = OrderForm() 
    contractor_form = ContractorForm() 

    return render_to_response('orders/make_order.html', {'order_form' : form, 'contractor_form' : contractor_form}) 

所以,如果POST請求到達這個方法我第一次檢查,如果ContractorForm已經排滿 - 我認爲如果表單有效,是指使用。如果是的話,比我保存它,並且想要將保存的對象的數據庫ID分配給OrderForm找到它的適當字段。

我所有的表單都是ModelForms。

的問題是:

  1. 是否有更好的方式來做到這一點? (從下拉列表中選擇或添加) - 更好或更pythonic ;-)
  2. 如何使用ModelForms獲取保存的對象ID?

編輯

我ContractorForm是:

class ContractorForm(ModelForm): 
    class Meta: 
    model = Contractor 

沒什麼特別的。

+2

在一個側面說明,利用反向(http://docs.djangoproject.com/en/dev/topics/http/url /#reverse),而不是直接在你的'HttpResponseRedirect'中引用'/ orders /'url ...它會爲你節省大量的頭痛在未來,相信我:) – sdolan 2010-09-06 22:42:02

+0

哈!你說得對,我應該早點完成。 – 2010-09-07 04:51:10

回答

7

save()應該返回新創建的實例。

if contractor_form.is_valid(): 
    instance = contractor_form.save() 
    parameters['contractor'] = instance 

其中id是instance.id,甚至更好instance.pk

pk vs. id

不管你自己定義一個 主鍵字段,或讓供應 Django的一個給你,每個模型 會有一個叫做PK屬性。它 在 模型上表現得像一個普通屬性,但實際上是 的別名,無論哪個屬性是模型的主鍵 字段。您可以閱讀並 設置此值,就像您將爲 任何其他屬性一樣,並且將 更新模型中的正確字段。在評論

後續:

那麼它在默認情況下不工作,所以必須有別的東西是錯誤的。

型號。PY

class Category(models.Model): 
    name = models.CharField(max_length=70) 
    slug = models.SlugField() 

forms.py

from django import forms 
from models import Category 

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = Category 

測試殼:

In [3]: from katalog.forms import MyModelForm 
In [4]: data = {'name':'Test', 'slug':'test'} 
In [5]: form = MyModelForm(data) 
In [6]: instance = form.save() 
In [7]: instance 
Out[7]: <Category: Test> 
In [8]: instance.id 
Out[8]: 5L 
+0

這是我第一次猜測,但不幸的是它不能像這樣工作。 ModelForm.save()返回None。應該有一種使用重載save()方法做到這一點的方法,但這看起來過於複雜和凌亂。 – 2010-09-07 04:50:37

+0

你可以告訴我們你的'承包商'ModelForm代碼嗎? – 2010-09-07 07:40:09

+0

好吧,我已經測試過了,並且你的解決方案能夠正常工作。然而,我會對我的具體情況進行更徹底的測試。 – 2010-09-07 19:51:51