2011-06-30 82 views
0

在應用程序中,我有Post模型。在管理面板中,我想只有一個條目 - 「帖子」和一個鏈接添加Post。在管理員職位列表中,我想查看他們所有人。Django:如何編寫models.py

所有的職位都有它的標題,內容和其他基本領域。

但是:

由於源後,職位可能有不同的領域。

Sources: 

--- First 
--- Second 
--- Third 
--- ...... 

例如,郵政與第一來源必須具有投票(但沒有分類)。 Post with second來源必須屬於類別分支#1(但沒有投票)。第三個來源的帖子可能有圖片字段(但沒有類別,也沒有投票)等等。

Category branch #1 

--- cb1_first 
--- cb1_second 
--- cb1_third 

Category branch #.... 

--- cb2_first 
--- cb2_second 
--- cb2_third 

因此,在後加頁我想要寫標題,內容等基本的東西,比我選擇來源並因選擇其他領域出現(爲第一來源是民意調查,爲第二 - 列表類別分支#1中的類別等)。

如果我製作基類Post,然後用其他類擴展它,我會在SQL中獲取額外的表格,並在應用程序管理中添加許多項目(例如添加基本貼,添加視頻貼,添加貼,添加貼與類別分支#2 ...)

詢問建議,如何組織這樣的應用程序。

+0

也許看看如何[Django的UserAdmin(https://code.djangoproject.com/browser/django/trunk/django/contrib/auth/admin.py)不它 - 當你創建一個用戶時,他們有多個步驟。 –

+0

我只有一個管理員用戶,這只是一個例子。真正的模型與用戶模型... – Friendka

+0

我知道,我只是說,管理工具在超過一個步驟創建的用戶(用戶名/密碼,那麼其他的東西)沒有assotiations;如果你知道他們是如何做到這一點的,那麼你可以有一個步驟來選擇來源,然後根據選擇的來源確定下一步。 –

回答

1

這是一個原因,我是一個強大的對手在與類似的事情空=假數據庫級別做驗證。做一個單一Post模式與任何類型的信息都可以有,但不執行該模型(blank=True, null=True)要求的所有字段。

然後,而是驗證您的表單上是否需要一個或另一個字段等,特別是在處理Admin時使用ModelForms。

如果在一個實例中,需要一定的字段中,可以強制執行使用:

class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyModelForm, self).__init__(*args, **kwargs) 

     if self.instance.source == 'first': 
      self.fields['poll'].required = True 

然後,對於僅顯示應該基於源,示出的實際字段,則可以工作起來或者你可以用ModelAdmin.get_fieldsets()明確地將它們排除在管理員之外。基本上,這個過程是這樣的:

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    fieldsets = (
     (None, { 'fields': ('common_field_1', 'common_field_2', 'common_field_3',), 
    ) 
    poll_fieldsets = (
     (None, { 'fields': ('common_field_1', 'common_field_2', 'common_field_3', 'poll',), 
    ) 

    def get_fieldsets(self, request, obj=None): 
     if obj and obj.source == 'first': 
      return self.poll_fieldsets 
     else: 
      return super(MyModelAdmin, self).get_fieldsets(request=request, obj=obj) 
+1

問題1: - 「Post」模型表的每一行都留下了很多空白字段。問題2: - 如果您事先不知道「Post」模型需要的所有字段,則很難擴展。 – vimukthi

+0

chrisdpratt,答案看起來不錯!但是我對數據庫中的空白字段感到尷尬。如果我沒有選擇,我會堅持這樣!但是可能有另一個機會來組織這樣的應用程序?我發現了一些關於「普通關係」,在註釋上面有一些關於「兩個步驟中添加項目」,我們通常是通過管理員添加用戶 – Friendka

+1

通用的關係是一個完全不同的野獸。使用您的後期示例,假設您最終爲每個PollPost,CategoryPost等創建了不同的模型。在您的Blog模型中,您不能簡單地引用Post,而是要爲每個帖子類型創建一個外鍵。這就是普通關係進來的地方。它們讓你擁有一個外鍵,可以不分皁白地持有任何類型的模型。但是,儘管他們的使用有時是完成某件事情的最好也是唯一的方式,但我發現它們是一件非常令人頭痛的事情,實際上卻很少是解決問題的最佳解決方案。 –

0

首先創建一個模型,包含您需要的任何基本字段(例如Post模型)。然後你可以創建一個模型來源 - Source模型。 Post模型應該有一個代表創建它的源的外鍵。 Source模型應該包含一個字段來存儲要實例化的模型的名稱,以存儲具有給定源的帖子的附加字段。然後爲您需要的每個附加字段集創建所有模型,每個模型都應該有一個帶Post模型的外鍵字段。例如,您可以使用外鍵創建一個Poll型號爲Post

這樣你可以參考Source模型的數據模型創建帖子時解決所有的字段類型以及檢索它們之後。