2013-02-18 30 views
6

嗨,Django管理:更新內嵌基於其他直列

在管理面板,我創建的形式添加產品。表單包含2個內聯表單,因爲有些與產品相關的模型。用戶可以創建產品,然後定義該產品的不同屬性。我會舉例說明這一點。用戶擁有3種不同顏色的一個品牌的T恤,並希望以不同的價格添加它們。 T恤被創建爲具有3種變體的產品。

class Detail(models.Model): 
    product = models.ForeignKey('Product') 
    attribute = models.ForeignKey('Attribute') 
    value = models.CharField(max_length=500) 

class Attribute(models.Model): 
    name = models.CharField(max_length=300) 

class Variant(models.Model): 
    product = models.ForeignKey(Product) 
    details = models.ManyToManyField(Detail) 
    quantity = models.IntegerField() 
    price = models.DecimalField(max_digits=6, decimal_places=2) 

我省略了產品,因爲它是無關緊要的。

class DetailInline(admin.TabularInline): 
    model = Detail 

class VariantInline(admin.StackedInline): 
    model = Variant 

class ProductAdmin(admin.ModelAdmin): 
    class Meta: 
     model = Product 

    inlines = [DetailInline, VariantInline] 

這很好地工作,模型保存良好,我有一個問題與變體內聯。變體內聯顯示詳細對象,但只有已保存在數據庫中的對象。爲了讓用戶更容易生活,最好的方法是在創建Detail對象時將Detail對象添加到Variant inline中,因此它必須在保存Product之前發生。

  • 有沒有辦法用值手動刷新內聯?
  • 是否有一箇中期保存我可以用來創建明細對象但不是產品並返回結果?
  • 模型應該重新設計? (我真的不想這樣做,除非我必須這樣做)
  • 用戶在添加產品時是否需要遵循不同的工作流程?

我試圖通過使用js注入條目到內聯,但這是hackish和Django沒有驗證與假值錯誤輸入錯誤的值已被選中。

我寫這個問題時腦海中浮現出的最後想法。可以創建js,以防萬一Inline對象的內聯形式被改變時會將數據傳遞給自定義視圖,從而創建對象並返回結果。我看到的一個問題(在它旁邊感覺不對)是如何通知django新對象創建的,因此它不會提出關於不存在的值的錯誤。

無論如何,我希望有人會理解這個長問題。

+0

你綁詳細到產品,而不是要變,對任何具體的原因? – 2013-02-25 07:10:09

+0

是的,我。它用於通過js過濾數據。 – 2013-02-25 17:30:38

回答

2

想到的一件事是Knockout.js

它非常適合同時更新DOM中的許多元素,並且您可以輕鬆地使用來自客戶端事件的Ajax調用將新值返回到自定義視圖。

有幾個框架,可以做到這一點,但我認爲這是淘汰賽的一個更容易閱讀和最流行的像骨幹,棱角分明,灰燼的實施等

的Django通常會抱怨動態添加選項,但只要它們在驗證表單時存在於服務器端,理論上應該沒問題。

+0

是的,它不會抱怨內嵌的新對象。但是我仍然有問題,因爲我的Detail需要參考產品。我比較接近,但還沒有。 – 2013-02-20 18:00:51

+0

聽起來像你在路上。 – Brandon 2013-02-20 19:14:47

0

我決定放棄這個想法,因爲它已經花費了很多時間,可能會花費更多。另外我想出的是比編碼更令人討厭的黑客行爲。但是,不要把這個掛在這裏掛我會發布給其他人的任何提示。

我有兩個不同的模型爲內聯表單集模型,它們都有主力車型的外鍵,其中一人有其他的外鍵。想法是根據用戶輸入的值在一個內聯中創建假條目。正如它所表現的那樣,使用jQuery隨Django一起發佈很容易。所以我做了,但當然,Django知道這個模型不存在。解決方案是創建我自己的表單和字段,並重寫clean()方法,就像我做的那樣here

這導致了很多問題,其中一部分是我的模型依賴於彼此和現場的清潔衛生()方法不得不砍掉一點點不爲db對象存在的檢查。除此之外,由於缺少有關POST數據的字段驗證階段的信息,所以必須覆蓋clean()方法的形式,因爲已經發布了數據。然而,它是不潔的,因此不得不從POST字典中提取和驗證。此時我決定停下來,因爲它越來越複雜,可能導致數據不一致。我猜測,下一步將覆蓋保存的ModelAdmin的方法創建的對象是不是在查詢集綁FORMSET,除非有一個地方的地方在哪裏可以做的方式。

總結這一點,我不得不說,在這一點上我絕不會做這種方式,用更好地控制數據流的我自己的看法change_form去。

TL;博士

創建自定義視圖change_form。