2012-03-04 61 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)