Question

J'ai un projet Django pro1 avec plusieurs applications: app1, app2, app3, etc. Je souhaite afficher un modèle de niveau supérieur contenant des blocs de chaque application:

example_base_template.html:

[header /]
[left nav bar]{{ app1 rendered template }}[/left nav bar]
[right nav bar]{{ app2 rendered template }}[/right nav bar]
[center section]{{ app1 main functionality template }}[/center section]
[footer]{{ app3 rendered template }}{{ app4 rendered template }}[/footer]

Tous ces modèles d'application sont dynamiques et utilisent une base de données. Comment faire cela de la manière la plus appropriée et la plus élégante? Ou peut-être que la question est de savoir comment connecter 4 vues différentes à une même URL?

Était-ce utile?

La solution

Nous avons eu un problème similaire à celui-ci et la clé consiste à obtenir les données correctes dans le contexte. Nous avons réparti la création de données / le remplissage du contexte pour chaque vue dans une routine de construction du contexte distincte. Les vues d'origine appellent simplement leur routine respective, puis rendent leur modèle. La vue composite appelle chacun des générateurs de contexte, puis rend le modèle principal, qui inclut ensuite les sous-modèles.

C’est là que nous avons rencontré un problème avec le système de templates Django. Nous mettions en cache des fragments de modèle et certains de ces fragments prenaient des données très coûteuses à générer. Si le fragment n'était pas périmé, nous ne voulions absolument pas faire le travail. Mais retarder le travail jusqu'à ce que nous sachions que nous en avions besoin signifiait que nous étions maintenant dans le modèle et:

  • Vous ne pouvez pas transmettre de paramètres à des méthodes à partir d'un modèle.
  • La méthode django.template .__ init __. Variable._resolve_lookup () a été interrompue car si vous passiez un appelable, elle ne l'appellerait pas! Si vous référencez une méthode d'un objet dans le contexte, cela fonctionne très bien.

La raison pour laquelle Callable est nécessaire au travail est qu’il vous permet de transmettre une fonction curried - c’est-à-dire une fonction qui a déjà certains (ou tous) ses paramètres spécifiés, mais qui n’a pas encore été appelé. Ainsi, la vue (ou le contexte généré dans le cas) devrait être en mesure de curry une fonction complètement spécifiée (rappelez-vous, vous ne pouvez pas passer de paramètres dans les modèles eux-mêmes) afin que le modèle quand il le faut pourrait appeler le callable, obtenir les données, et on s'en va.

Nous avons adopté deux approches distinctes à cet égard:

Depuis que nous avons créé ce site, j'ai appris que nous aurions peut-être pu le résoudre en utilisant des générateurs en tant que producteurs de données en différé. Les générateurs agissent en quelque sorte comme une fonction curryed (en ce sens que vous pouvez transmettre des paramètres arbitraires pour la configuration), mais le moteur de gabarit les considère comme un simple autre itérateur. Il existe un excellent didacticiel sur ce sujet. Remarque: les générateurs ne sont pas des tableaux et vous ne pouvez les consommer qu'une seule fois. Il est donc peut-être nécessaire de modifier une partie de votre logique.

La prochaine fois, je pense que nous allons simplement utiliser les modèles jinja2 et cesser de visser avec les modèles de Django. .

Autres conseils

Vous pouvez utiliser un {% include%} tag. Mais cela ne vous aide pas beaucoup. La meilleure solution consiste à écrire une balise d'inclusion personnalisée avec le modèle et les fonctionnalités nécessaires.

Vous ne pouvez pas (de manière simple) mélanger plusieurs vues en une seule. Essayez les tags de sa jolie solution Django.

Je l’ai fait en écrivant des balises de modèle personnalisées pour chaque application que je voulais inclure. Au début, mes balises de modèle venaient de renvoyer du code HTML codé en dur. Plus tard, j'ai découvert que les balises pouvaient charger leurs propres fragments de modèle. Il y avait aussi un extrait quelque part qui était une dernière balise de contenu générique qui fonctionnait plutôt bien.

De nombreuses applications réutilisables (en particulier celles sélectionnées dans le projet Pinax ) constituent d'excellents exemples d'utilisation des fonctions personnalisées. balises de modèle pour insérer du contenu. La talk de James Bennett peut également aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top