Surcharge d'un projet Django

a marqué ce sujet comme résolu.

Bonjour à tous !

Je cherche à utiliser un projet Django comme une lib tierce (un CMS open source) en surchargeant ses vues, modèles et urls.

Pour cela j’ai écris un setup.py pour ce projet, une fois installé j’ai inclus les apps du projet dans mon settings.py.

INSTALLED_cms_APPS = [
    'cms.cms_core',
    'cms.cms_config',
    'cms.media',
    'cms.content',
]

J’ai fait pointer les URLs de mon projets sur les urls.py de chacunes des apps du CMS.

for app_name in settings.INSTALLED_CMS_APPS:
    short_app_name = app_name.split('.')[-1]
    urlpatterns += patterns('', (regex_url, include('%s.urls' % app_name)))

syncdb, migration, à ce stade là tout fonctionne.

Exemple de cms.content.models:

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

Exemple de cms.content.views:

def post_list(request):
   p = Post.objects.all()
   return render(request, 'blog/post_list.html', {'p', p})
    

Maintenant je cherche, par exemple, à ce que la vue post_list renvoie des données de mon modèle Comment sans modifier directement les sources mais en le faisant dans mon projet.

Auriez vous une idée de comment procéder ?

C’est un sujet large, j’en ais conscience, mais je ne parviens pas à trouver de doc à ce sujet même si la documentation Django en donne une introduction.

+0 -0

Salut,

Ça va dépendre du CMS utilisé, si celui-ci permet ou non de configurer le modèle utilisé dans la vue.

Mais sinon tu as toujours moyen de créer ton propre modèle à côté et de relier les deux par un champ one-to-one.

Bonjour, merci de vos réponses,

Ça va dépendre du CMS utilisé, si celui-ci permet ou non de configurer le modèle utilisé dans la vue.

entwanne

Je cherche une méthode générique pour ajouter des fonctionnalités à une application Django sans la modifier directement ou par sa configuration.

Mais sinon tu as toujours moyen de créer ton propre modèle à côté et de relier les deux par un champ one-to-one.

entwanne

Ta réponse qui m’invite à créer un modèle lié serait parfaite si elle développais comment surcharger la vue et l’url associée sans toucher aux sources du CMS :)

Je ne sais pas si tu as vu djangocms-installer. Il prend en compte toutes les étapes de base pour utiliser django en CMS.

A-312

Merci mais ce n’est pas vraiment la configuration du CMS qui me pose problême mais un cas général: Comment surcharger une application Django ou modifier son comportement sans avoir à modifier son code source (ce qui rendrait la maintenance difficile au fil des MaJ) ?

Ta réponse qui m’invite à créer un modèle lié serait parfaite si elle développais comment surcharger la vue et l’url associée sans toucher aux sources du CMS :)

Nogs

Le template il doit a priori être possible d’ajouter un autre répertoire et de jouer sur la précédence pour qu’il soit découvert par django en premier dans la recherche des fichiers de gabarit.

Mais pour le reste je ne sais pas plus précisément, il doit bien exister des mécanismes mais je ne les connais pas.

Je vais décrire mes avancées.

Mon objectif dans cet exemple est de surcharger l’application content.

Le CMS est dans mon PYTHONPATH.

Je crée un projet ExtendCMS et son application content.

J’installe ses apps Django:

INSTALLED_APPS = [
    'ExtendCMS.content',
    'cms.cms_core',
    'cms.cms_config',
    'cms.media',
    'cms.content',
]

syncdb, migration, tout fonctionne.

Dans ExtendCMS/content/urls.py je fais pointer les urls que je ne veux pas modifier vers la lib, et je surcharge celle que je souhaite.

urlpatterns = patterns('',
    (r'^edit/(?P<id>\d+)$',   'cms.content.views.edit'),
    (r'^post_list/)$',        'ExtendCMS.views.post_list'),
)

Evidemment j’adapte aussi les urls du projet.

Comme mes modèles ont déjà été crées je retire l’app à surcharger (oui c’est sale… :honte:)

INSTALLED_APPS = [
    'ExtendCMS.content',
    'cms.cms_core',
    'cms.cms_config',
    'cms.media',
    #'cms.content',
]

Cela fonctionne mais il doit bien y avoir une methode plus clean, je ne peux pas être le premier avec ce besoin. Si o_O ?

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte