Django: organizando aplicaciones de un proyecto

No sé si esto sería más una entrada afirmativa o interrogativa, porque no sé si soy un maniático de la organización o es que no doy encontrado el método óptimo de hacer las cosas, probablemente sea esto último y todavía no tengo los conocimientos o no he leido lo suficiente sobre esta temática (cualquier pista es bienvenida, por supuesto).

Cada vez que empezaba un proyecto en Django -creo que es algo específico de Django por su forma de organizar los proyectos- me pasaba lo mismo siempre, la duda entre desarrollar algo monolítico e irreutilizable u organizar las funcionalidades en aplicaciones atómicas.

Obviamente siempre me he decantado por lo segundo, y la historia se sigue repitiendo: acabas una funcionalidad en una aplicación atómica y el siguiente paso es parametrizarlo todo de forma que quede preparado para utilizarlo una segunda vez.

Y el siguiente paso lógico después de leer un poco más es subir la aplicación a pypi para poder tirar de ahí en un futuro. Es genial tener un gestor de paquetes con más de 35.000 aplicaciones listas para poder usarse. Llegados a este punto pensé que tenía la mejor opción organizativa para mis proyectos.

Pero también tiene ciertos puntos débiles que no sé cómo "arreglar". Si quiero variar en algo el comportamiento de esas aplicaciones para un proyecto concreto, imagino que habrá una forma sencilla de extender la aplicación y modificar la lógica sin tener que copiar/pegar, pero todavía no he llegado a ello. No sé, un campo nuevo específico en el modelo, o un comportamiento distinto en la lógica. En las plantillas sí las tengo controlado cómo extenderlas.

Tampoco me acabo de llevar bien con las partes "supuestamente" comunes a todas las aplicaciones, que no sé si se pueden aislar (o cómo aislarlas de forma correcta). Por ejemplo cuando te planteas una categorización (categorías de toda la vida), o registro/autentificación, podrían usarse en varias parte del proyecto (foro, noticias, tienda...). ¿Es mejor crear la funcionalidad en una aplicación separada pensada para poder reutilizarse en cualquier parte del proyecto o hardcodearla tantas veces como haga falta en cada una de las aplicaciones?.

Otra cosa que me lleva de cabeza es el interfaz administrativo. Hasta ahora he tirado de contrib.admin y, a falta del nuevo interfaz, nuevos requerimientos o de probar algún theme, me gustaría desarrollar uno propio que, teniendo en cuenta las apps instaladas en el proyecto, permita administrarlas de forma más eficiente (filtros para mostrar sólo registros pertenecientes al usuario logueado, drag and drop para ordenaciones, preview de contenidos...). Lo primero que se me ocurre es crear otra app atómica que tire de django.conf.settings.INSTALLED_APPS y a partir de lo que ahí haya instalado, muestre la parte administrativa correspondiente.

Como véis, llegados al punto de coger una app de pypi y extender o administrar su funcionalidad, o a la hora de decidir qué funciones son o no reutilizables, me encuentro con muchas dudas así que, como decía al principio, si te ha pasado lo mismo y lo has solucionado o se te ocurre cómo solucionarlo, cualquier pista o truco es de agradecer.

django code

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.