2009-11-20 3 views
0

Disons que j'ai un site Web avec une petite application qui répertorie les 10 nouveaux membres, ou quelque chose de dynamique comme ça. Je veux que cela soit affiché sur chaque page, peut-être dans une barre latérale. Comment pourrais-je faire cela?Appeler petite application dans le modèle

Mes pensées à ce sujet. Je n'ai peut-être pas encore tout le django, mais quand j'ai une URL comme/foo/en appelant une barre de vue - mais quelle information dois-je envoyer au template à partir de cette vue. Est-ce que chaque vue doit envoyer les informations au modèle (juste pour que je puisse voir mon application) ou est-ce qu'il y a quelque chose à appeler à partir du modèle à la place.

J'ai essayé de lire la documentation, mais il semble que je ne peux pas comprendre cela.

Répondre

4

La manière habituelle de fournir le type d'informations des 10 nouveaux membres à partir d'autres applications est d'utiliser une balise de gabarit. Voir this article de James Bennett sur les meilleures pratiques (bien qu'il soit un peu dépassé, car il a été écrit avant que les raccourcis inclusion_tag et simple_tag soient disponibles).

+0

Merci! C'était exactement ce que je cherchais! –

1

« Est-ce que toutes les vues doivent envoyer les informations au modèle (je peux juste pour voir mon application) »

Oui.

"Est-il possible d'appeler cela à partir du modèle à la place."

n °

Vos vues ne sont que des fonctions. Les fonctions peuvent appeler d'autres fonctions. C'est un bon design ordinaire. Vous pouvez toujours faire du bon design ordinaire dans Django.

Vous avez la possibilité de fournir un "contexte". Ceci est toujours fait dans les vues pour fournir un "contexte" supplémentaire pour les modèles. Voir http://docs.djangoproject.com/en/dev/ref/templates/api/#writing-your-own-context-processors pour écrire votre propre processeur de contexte.

Rien (enfin presque rien) n'est fait dans le modèle excepté rendre les objets fournis par la vue en HTML (ou XML).


Si vous avez une page qui est une fusion de choses de nombreuses applications petites, alors vous avez deux niveaux d'applications.

  • Applications indépendantes. Composite Apps qui dépendent des applications composites ou indépendantes.

Votre application composite peut appeler d'autres fonctions d'affichage d'applications pour rassembler des données.

Votre modèle d'application composite peut inclure d'autres éléments de modèle d'application pour présenter ces données.

Vous avez toute la puissance de Python pour décomposer les applications indépendantes en fonctions "production de données", fonctions d'affichage, composants de modèle et modèles de page finale.

Une page d'application indépendante utilisera une fonction de visualisation et un modèle. La fonction de visualisation utilisera les fonctions de production de données. Le modèle utilisera les composants du modèle.

La décomposition fonctionne toujours, même dans Django.

+0

Rien? Les balises de modèle font quelque chose. – Oli

+0

Okey, j'avais peur de ça. Mais comment feriez-vous cela. Vous avez quelques petites applications comme ces nouveaux utilisateurs, peut-être quelques autres. Comment structureriez-vous cela pour le rendre facile. Je veux dire DRY et tout. Voulez-vous créer une fonction qui calcule les utilisateurs les plus récents et appelez-la à partir de votre vue, puis envoyez les données au modèle. Si oui, comment cela se fait-il de la manière la plus «sensée»? merci pour la réponse d'ailleurs –

+0

@Oli: Les étiquettes de modèles peuvent itérer et prendre des décisions simples. Ils ne devraient pas remplacer la bonne logique de vue. Oui, ils * peuvent * faire pas mal de choses. Mais la performance souffre généralement. –

1
  1. Créer une étiquette de modèle que vous pouvez appeler sur la page
  2. Créer un processeur de contexte et d'injecter des variables de contexte supplémentaires sur chaque pageload

Je suis sûr qu'il ya d'autres façons de le faire, mais ce sont probablement les deux plus logiques. Le premier vous donne plus de puissance et perdra moins de temps de traitement (pour les pages où vous ne voulez pas afficher les données) mais un processeur de contexte est beaucoup plus simple à écrire (vous n'avez pas besoin de vous pencher en arrière pour le template_tag dieux).

Les deux sont des choses de valeur à connaître, alors c'est parti. Allez et apprenez!

+0

Le processeur de contexte doit être # 1. Une balise de modèle qui «fonctionne» (comme une requête) peut se transformer en un problème de performance difficile à tester et à déboguer plus rapidement qu'un processeur de contexte. –

+0

Complètement, absolument pas d'accord avec S.Lott. Les processeurs de contexte sont strictement pour les choses à faible impact - rendant les paramètres disponibles, l'URL des médias, ce genre de chose. Si vous avez besoin de travailler, une balise de modèle est la voie à suivre. Avec le processeur de contexte, que faire si vous avez soudainement besoin d'une page - ou d'une section - sans cette requête? C'est fait sur toutes les pages et il n'y a aucun moyen de l'éteindre. –

+0

Bien sûr, s'ils ont corrigé la fonction _resolve_lookup dans le code de gestion des variables de gabarit afin de traiter correctement les callables de premier niveau, vous pouvez créer une fonction curry et la coller dans le contexte. . C'est un patch de 10 lignes que je dois continuer à faire sur chaque projet. Sinon, utilisez jinja2 pour modéliser et faites simplement l'expression python là où vous en avez besoin dans le template. –

Questions connexes