Question

L’intérêt d’un framework MVC est de séparer la conception (modèles) de la logique (contrôleurs). Cependant, les langages modèles offrent souvent un degré limité de "logique de conception". arriver. Cela inclut les instructions de base si, les boucles, le filtrage, etc.

J'ai créé une balise de modèle Django pouvant prendre n'importe quelle liste ou QuerySet et "pagify". il. Il divise la liste en pages en fonction d'un format de page spécifié, puis ajoute les pages au contexte. L'utilisation est la suivante:

{% pagify articles by 20 as pages %}

Je peux ensuite appeler une inclusion distincte pour parcourir les pages et produire une belle liste de pages là où j'en ai besoin.

Cela semblait être un moyen optimal de le faire car cela me permettait de feuilleter toute liste dans le contexte; Je n'ai pas eu à compter sur le contrôleur pour renvoyer des résultats paginés. Mais un collègue a fait valoir que cela semblait être trop logique pour le modèle. Je pensais que cela relevait toujours de la logique de conception car la page continuerait à fonctionner même sans pagination, et déterminer la taille de la page se présentait comme une responsabilité de modèle.

Ma question est-ce trop de logique pour le modèle? ou est-ce une façon propre de gérer cela?

Était-ce utile?

La solution

Dit comme ça; Et si vous utilisiez votre modèle de données sur un autre support, par exemple, pas sur le Web, mais via une application ou une tâche en arrière-plan basée sur une console? Ne serait-il pas agréable de pouvoir obtenir des "pages"? des données via un contrôleur (ou un gestionnaire) plutôt que de devoir s’appuyer sur un modèle pour faire ce travail pour vous?

Même si je suis certainement d'accord pour dire que le "look" des données paginées doit être gérée par votre modèle, l’option " act " La pagination doit être laissée à un contrôleur (vue Django) ou même via une sorte de méthode de gestionnaire personnalisé (models.Manager).

Autres conseils

J’ai toujours compris que la vue n’était pas censée être dépourvue de logique. Il est juste supposé être dépourvu de toute logique de contrôleur. La pagination a juste à voir avec la façon dont les données sont affichées, ce qui est exactement ce que la logique de vue est supposée contenir.

La vue ne doit pas contenir de logique métier ou de logique de navigation. Vous décrivez la fonctionnalité de présentation (en évitant soigneusement le mot-l ici), qui peut être placée dans la couche de vue.

Vous pouvez consulter django-pagination , qui fournit une présentation similaire. balise de modèle.

Je suis d'accord avec votre collègue. le modèle doit être alimenté en données paginées plutôt que de procéder à la pagination. Je pense que la question clé est de savoir si déterminer la taille de la page est un devoir de modèle, et je ne le pense pas; Je dirais que cela devrait être traité à un niveau supérieur.

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