Question

Je vais avoir un problème avec les modèles de django pour le moment. J'ai 3 fichiers de modèle essentiellement:

  • Base de
  • story_list
  • story_detail

Story_list et _detail étendre la base, et qui fonctionne parfaitement bien. Cependant, la liste et les détails partagent un code qui se prolongent le modèle de base pour ma barre latérale. Je répète essentiellement un morceau de code dans les deux modèles, et le programmeur en moi dit que ce tout simplement faux. Il doit y avoir une meilleure façon, je suis sûr. J'ai essayé comprend, mais j'ai dans le fichier inclus:

{% block item %}
    content stuff
{% endblock %}

pendant environ trois blocs. Le problème est que rien de tout cela est pris / rendu. Si j'inclure le fichier dans une section de bloc qui étend la base, il déverse tout correctement, mais si je ne comprends pas dans un bloc, je reçois rien. Est-SSI la voie à suivre? Je jouai avec cela, mais cela ne semble pas fonctionner correctement non plus. Toute aide est appréciée.

Était-ce utile?

La solution

En général, en utilisant s n'est pas include la réponse avec des modèles Django. Permettez-moi de répondre à votre question sur plusieurs fronts.

Tout d'abord, permettez-moi d'aborder la barre latérale.

  • sont presque toutes les pages communes allez utiliser cette barre latérale? Mettre en Base. Ne pas remplacer les blocs de la barre latérale (à savoir ne les écris pas du tout dans vos modèles Story_*).

  • Est-ce la barre latérale unique aux modèles Story_base? Faire un autre modèle appelé, par exemple, et étendre cette Story_list. Cela équivaut à faire une superclasse abstraite en Java. (La réponse était dans ma tête, mais était libellé sans pitié arnaquer de jpwatts).

Ensuite, laissez-moi d'aborder l'héritage de modèle. Disons que vous avez un modèle nommé qui va {% extends "Base" %} <=>. À ce stade, après seulement mettre <=>, <=> est exactement <=>. Tout ce que vous mettez est ignoré dans <=>, parce que le modèle est déjà complet. La seule chose que vous pouvez faire est maintenant override blocs qui ont été définis dans <=>.

Enfin, permettez-moi d'aborder s <=>. Essayez de les éviter toujours. D'autres moteurs structurants, tels que PHP, semblent encourager l'utilisation de <=>. Cependant, cela peut conduire à des modèles moins faciles à gérer à long terme. Il est un peu plus difficile de jeter un regard à un extrait inclus et immédiatement vérifier sa place dans la hiérarchie de votre modèle. Ils sont aussi plus difficiles à factoriser dans la hiérarchie de modèle, surtout si vous les inclure à plusieurs niveaux (une fois en <=>, deux fois dans <=>, une fois dans certains des <=>, etc.).

Autres conseils

S'il y a un code commun entre les modèles de l'histoire qui ne sont pas nécessaires à l'échelle site, je créer un story_base (extension l'original base) et que mes modèles d'histoire qui étendent.

Vous avez un {%}% comprennent tag pour cela.

{% include xxx.html %}

Cette balise fonctionne.

Une autre manière consiste à utiliser des filtres. Filtre appelle une fonction pour le rendu, modèle peut être utilisé lors du rendu.

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