IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

héritage de template


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 12
    Par défaut héritage de template
    Bonjour à tous.
    Je précise que bien qu'étant un développeur qui fut aguéris en php il y a quelques années je suis désormais débutant en python et django (j'ai arrêté de programmer pendant 5 ans et perdu quelques réflexes)

    Je cherche à developper un site dont le front se divise en deux parties bien distinctes.
    J'ai donc créé deux applications dans [monSite] : [appliA] et [appliB] (ce sont des noms d'exemple bien-sur)
    Quand on arrive sur le site on à deux liens pour choisir où l'on veut se diriger.
    L'accueil du site est donc accueil.html qui hérite de base.html et se trouve dans [monSite/templates/monSite]
    Ensuite quand on a cliqué l'un ou l'autre des liens les pages héritent du base.html de l'application en cours : [monSite/appA/templates/appA]
    J'ai un problème à partir du moment ou je souhaites faire une page commune aux deux applications, la page contact.html.
    J'arrive bien à charger la même page pour les deux applications mais j'aimerais que celle ci hérite du fichier base.html de l'application en cours.
    En haut de mon fichier contact.html j'ai {% extend 'base.html' %}
    comment faire pour que selon l'application en cours cela devienne {% extend 'appliA/base.html'} et {% extend 'appliB/base.html %}
    J'ai essayé sans succès {% extends 'app_name/base.html' %} en ayant pourtant au préalable bien défini app_name dans appliX\urls.py mais le app_name n'est pas interprété

    Merci à vous.

  2. #2
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    C'est un vieux pattern, introduit a l'epoque par django-hotclub. Reponse: tout simplement dans l'appliA, commencer les templates par {% extends 'appliA/base.html' %} et de meme pour l'appliB. Dans les deux base.html differentes commencer par {% extends 'base.html' %} et le tour est joue.

    Autrement, saches que tu peux aussi utiliser une variable en argument de extends, par exemple {% extends app + '/base.html' %}, auquel cas il faudra que le contexte contienne une clef app. Ou alors, tu peux ajouter un attribut base_template a tes vues, ca sera sans doutes un peu plus rigolo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class AppAMixin:
        base_template = 'appA/base.html'
     
    class YourCreateView(AppAMixin, generic.CreateView):
        # ....
    Et ensuite dans le template {% extends view.base_template %}, car view fait partie du contexte par defaut dans les vues generiques.

    Mais personnelement, j'evite ce pattern, je prefere heriter directement de templates du projets. Du coup, dans monSite j'ai des templates a la racine tels que form.html, list.html, detail.html, resultat je vais bcp plus vite en regle generale.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 12
    Par défaut
    Bonjour Is_null et merci bien pour ta réponse.

    Je n'ai pas vraiment compris ta première solution car la base des appli A et B ne peut hériter de la base générale qui ne sert que sur la toute première page du site.
    J'ai regardé pour ta deuxième solution par variable (ce que je n'arrivais pas à faire)
    Voici ce que j'ai fait, je veux bien que tu me dise si c'est standard et/ou correct niveau organisation du code.
    J'ai fait la même chose dans les deux applis, par exemple pour l'appli A :

    Dans le view.py de chaque appli j'ai ajouté un dictionnaire en argument à la fonction render() pour lui passer en variable le bon emplacement de la base à charger (A pour A, B pour B):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def contact(request):
        return render(request, 'contact.html', {'base_template':'appliA/base.html'})
    Ensuite en haut de mon fichier contact qui lui n'est donc pas dans une appli mais le même pour les deux applis j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% extends base_template %}
    Cela fonctionne mais qu'en penses tu ?

  4. #4
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Aucun probleme, effectivement j'avais pas compris ce que tu appelles application ne correspond pas a "l'app Django", cad un nom d'app que tu aurais dans INSTALLED_APPS, du coup, j'ai mal compris le sujet.

    Amuses toi bien avec Django
    ++

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 12
    Par défaut
    Tu avais bien compris, j'ai monsite et dedans appA et appB toutes deux chargées dans INSTALLED_APPS qui se trouve dans settings.py à la racine de monsite.

    J'ai une autre question du même ordre si tu le veux bien.

    Je vais avoir une classe (et une table donc) client qui sera elle aussi commune aux deux applications (je commence à me dire que j'ai peut être mal découpé mon projet pour le coup) cependant je vois qu'il n'y a pas de models.py à la racine mais seulement dans mes applications, j'en ai créé un mais il ne semble pas prit en compte lors des migrate car la base de donnée n'est pas mise à jour.
    je l'ai bien commencé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from django.db import models
    j'imagine qu'il faut informer django de tenir compte de se fichier mais je n'arrive pas à trouver cette info dans la doc.

    Merci pour tes messages

Discussions similaires

  1. "Héritage" ou "Template de table"
    Par mr_yvele dans le forum PowerAMC
    Réponses: 1
    Dernier message: 13/09/2007, 17h45
  2. Héritage classe template->classe template
    Par zabibof dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2007, 11h05
  3. Réponses: 16
    Dernier message: 17/03/2007, 17h31
  4. Héritage et Templates
    Par rulianf dans le forum C++
    Réponses: 5
    Dernier message: 26/10/2005, 17h09
  5. héritage et template STL
    Par jevito dans le forum Langage
    Réponses: 5
    Dernier message: 21/09/2005, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo