Estoy trabajando en un cms / blog muy básico. para mi propio uso, depende de django-adminfiles y django- markitup. Debido a que podría querer distribuir la aplicación, he estado tratando de encontrar una manera de verificar si esas dependencias se cumplen y recurrir a los valores predeterminados de django si no están en las aplicaciones instaladas.

Se me ocurrió el siguiente código y funciona. La cosa es que se siente engorrosa y agrega mucho código al encabezado del script. Me preguntaba si hay otras formas (recomendadas) de lidiar con las dependencias. En caso de que haya respondido a mi propia pregunta (ya que el código está funcionando), cualquier comentario es bienvenido.

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')

Puedo usar la aplicación en un nuevo proyecto de django o eliminar archivos de administración de las aplicaciones instaladas y seguirá funcionando en el administrador.

2
Maarten 4 mar. 2012 a las 14:18
¿Necesita la instrucción if en su clase HomePageAdmin? ¿No se ignorará el adminfiles_fields si se subclasifica directamente admin.ModelAdmin?
 – 
Alasdair
4 mar. 2012 a las 18:44
Gracias por señalar eso. No necesito la declaración if para adminfiles_fields, lo hago para MarkitupWidget, cambié mi código. Veré si puedo escribir un settings.py agradable para activar o desactivar todo esto.
 – 
Maarten
4 mar. 2012 a las 20:59

1 respuesta

La mejor respuesta

Así es como lo hice eventualmente:

Cree un archivo settings.py dentro del módulo de la aplicación:

import django
from django.conf import settings

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

Ahora puedo activar y desactivar fácilmente la configuración desde el archivo de configuración de mi proyecto.

Luego agregó lo siguiente a 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)
1
Maarten 21 mar. 2012 a las 00:25