2016-02-10 42 views
7

客戶想要將自定義字段添加到我們提供的django模型。將自定義字段添加到django模型(不更改源代碼)

他想自己做這個,不用編程。

這些東西應該是可加成:

  • 布爾(是/否)領域。可選的 「未設置」
  • 單選領域
  • 選擇題領域
  • 單行文本字段
  • textarea的領域
  • 日期

例子:

客戶希望添加一個他稱之爲「成功」的領域。並且該字段>應該有這些選擇:是/否/未設置。默認未設置。

如果我可以通過創建或擴展模型來做到這一點,事情會變得簡單。但是,在這種情況下更改源代碼被允許:-(

如何解決這個

更新

查詢實例與給定值,需要支持?例如:。顯示所有實例,其中「成功」是真。

+1

當你說沒有源代碼改變......當然你接受什麼東西必須改變,以添加任何東西? 'JSONField'就夠了嗎? – Sayse

+0

我更新了問題。查詢需要支持。我不確定JSONField是否支持這一點。 – guettli

+1

這聽起來更像是一個客戶要求的東西實際上並不是他們想要的東西。我會非常懷疑給予任何外部實體免費統治他們可以污染我的數據庫 – Sayse

回答

0

如果這真的是你想要的。

  1. 創建電子郵件你的客戶需要的領域。

    boolean_field_1 = models.BooleanField(..) 
    boolean_field_2 .. 
    date_field_1 = .. 
    date_field_2 = .. 
    
  2. 存儲別名映射的地方。

    我可以添加一個字段進行別名映射。

    json_mapping_field = JSONField() 
    # this has is_successful: boolean_field_1 
    
  3. 然後找個地方可以替代別名回真正的字段名

    簡單過濾和更新,您可以覆蓋

    1. QuerySet.filter Queryset.exclude
    2. QuerySet.update,UpdateQuery.add_update_values
    3. 最後使用from_queryset爲您的管理器使用超級用戶的QuerySet。
+0

好的,這可以工作。但是,也許你可以爲每個數據類型創建一個模型,而不是「boolean_field_1」,「boolean_field_2」,...背景:也許一個客戶需要20個boolean_fields ... – guettli

+0

或者你可以考慮分配可能字段的不同方案。如果這是針對調查問卷的應用程序,客戶可能會對具有不同*字段需求*標準的問題類型有所瞭解。只要有映射規則,就可以將任意字段集合分配給表。 – eugene

+0

甚至可以有10個布爾值最大值和100個布爾值最大值的表格,如果他需要小於10或100個值,則使用10(只要您可以在步驟#3中實施映射規則) – eugene

2

我用Django Dynamic Forms。開箱即用,它允許用戶通過管理員創建自己的表單。你可能想要擴展它來構建一個更加用戶友好的用戶界面,但這應該會讓你變得相當遠。它支持

  • 布爾
  • 選擇(選擇)
  • 多種選擇(多選)
  • 日期
  • 日期時間
  • 時間
  • 電子郵件
  • 整數
  • 單行文字
  • 多行文本
7

您可以創建一個遵循表EAV principle(實體屬性值)。基本上,這是用下列的去歸一化表:
[ID(和/或蛞蝓),float_value,integer_value,STRING_VALUE](添加更多的列到這個表)

現在說你叫一個現有表「會員」。當客戶通過用戶界面添加動態字段時,您可以在此處添加條目並使用「ID」查找給定成員。

2

好吧,當我有這樣的問題,我用來創建自定義字段模型中,一個名字字段和類型字段,通常與可能的字段類型選擇,一個選擇字段。您還可以添加is_active字段以過濾活動和不活動的CustomField。

比,當我創建的,我搜索這個對象知道哪些字段我必須以這種形式。

來存儲數據,我倒是有另一種模式,稱爲CustomFieldAnswer,或somethink這樣。這個模型應該有一個ForeignKey到應該有這個數據的主模型和自定義字段。

這樣做,你可以擁有任何種類的dinamically YOUT模型領域和wothout你需要客戶到任何代碼。

你可以使用元編程的基於CustomFields查詢窗體創建acutual領域。或者,您可以將這些字段放在模板中,然後更改每個CustomField的輸入類型。

希望有幫助!

0

我知道這聽起來像一個可怕的黑客,但也許你可以構建創建文本文件的界面?

  1. 一個文件是models.py,與模型的定義,但不包括這種模式從遷移與managed = False
  2. 另一個文件與刪除SQL如果客戶想要一個新表CREATE表,或者只是ALTER表。
  3. 另一個腳本可以運行SQL腳本,將models.py文件複製到正確的目錄,然後重新加載django。
+0

?這是一個不常見的問題,這不需要通用的解決方案。 –

0

我剛剛發現,有甚至djangopackages比較網格一下:

https://www.djangopackages.com/grids/g/dynamic-models/

標題:

應用程序將字段添加到模型的設置,或即使在運行時。

一些StackOverflow管理員刪除了這個答案,這就是爲什麼我再次寫它。

缺失的原因是:

雖然此鏈接可以回答這個問題,最好是在這裏有答案的主要部件,並提供鏈接以供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效。

以下是今天這是在比較網格中列出的當前套餐:

+0

請告訴我爲什麼這個答案得到了表決。這不是一個只有鏈接的答案。 – guettli

相關問題