Работа с зависимостями и поддержание подключаемости приложения - PullRequest
2 голосов
/ 04 марта 2012

Я работаю над очень простым 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 или удалить файлы администрирования из установленных приложений, и оно все равно будет работать в админке.

1 Ответ

1 голос
/ 06 марта 2012

Вот как я это сделал в конце концов:

Создайте файл 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)
...