2012-03-04 59 views
2

我正在研究一個非常基本的cms /博客。爲我自己使用它取決於django-adminfiles和django- markitup。因爲我可能想要分發應用程序,所以我一直試圖找出一種方法來檢查是否符合這些依賴關係,如果它們不在已安裝的應用程序中,則會回退到django的默認值。處理依賴關係並保持應用程序可插入

我想出了下面的代碼,它的工作原理。事情會讓人覺得很麻煩,並會在腳本的頭部添加大量代碼。我想知道是否有任何其他(推薦)處理依賴關係的方法。如果我回答我自己的問題(因爲代碼正在工作),歡迎任何評論。

from django.conf import settings as django_settings 

# Check installed apps for django-markitup and django-adminfiles 
if 'adminfiles' in django_settings.INSTALLED_APPS: 
    from adminfiles.admin import FilePickerAdmin 
    adminfiles = True 

    #inherit from FilePickerAdmin 
    class ModelAdmin(FilePickerAdmin): 
     pass 
else: 
    adminfiles = False 

    #inherit from admin.ModelAdmin if adminfiles =false 
    class ModelAdmin(admin.ModelAdmin): 
     pass 

#then my own admin class inherits from ModelAdmin above  
class HomePageAdmin(ModelAdmin): 
    exclude = ('slug',)  
    list_display = ('title', 'status',) 
    list_filter = ('section',) 

    if adminfiles: 
     adminfiles_fields = ('body') 

我可以使用該應用程序在一個新的Django項目或安裝的應用程序刪除adminfiles,它仍然會在管理工作。

+0

你需要的if語句在'HomePageAdmin'類?如果直接將'admin.ModelAdmin'分爲子類,那麼'adminfiles_fields'不會被忽略嗎? – Alasdair 2012-03-04 14:44:20

+0

謝謝你指出。我不需要te如果爲adminfiles_fields聲明,我爲MarkitupWidget做,我改變了我的代碼。我會看看我是否可以寫一個不錯的settings.py來打開或關閉所有這些。 – Maarten 2012-03-04 16:59:44

回答

1

這是我做的最後:

創建應用程序模塊內部settings.py文件:

import django 
from django.conf import settings 

SECTIONS_EXTRAS = getattr(settings, 'SECTIONS_EXTRAS', False) 

我現在可以輕鬆地打開設置,並從我的項目的設置文件了。

然後添加以下到admin.py:

from django.conf import settings as django_settings 
from sections.models import HomePage, 
from sections import settings 

markitup = False 

if settings.SECTIONS_EXTRAS: 
    # Check installed apps for django-markitup and django-adminfiles 
    if 'adminfiles' in django_settings.INSTALLED_APPS: 
     from adminfiles.admin import FilePickerAdmin 

    class ModelAdmin(FilePickerAdmin): 
     pass 

    if 'markitup' in django_settings.INSTALLED_APPS: 
     from markitup.widgets import MarkItUpWidget 

    markitup = True 
else: 
    class ModelAdmin(admin.ModelAdmin): 
     pass 

class HomePageAdmin(ModelAdmin): 
    exclude = ('slug',) 

    list_display = ('title', 'status', 'section') 
    list_filter = ('section',) 

    # Extras 

    adminfiles_fields = ('body') 

    if markitup: 
     def formfield_for_dbfield(self, db_field, **kwargs): 
      if db_field.name == 'body': 
       kwargs['widget'] = MarkItUpWidget() 
      return super(HomePageAdmin, self).formfield_for_dbfield(db_field, **kwargs)