46 votes

Django: annulation ET extension d'un modèle d'application

Si vous souhaitez remplacer un modèle à venir avec une application django (dans app/templates/app/) vous pouvez créer un modèle du même nom dans un autre répertoire, dans lequel le modèle de chargeur de vérifications avant l'application du modèle dir. Si vous voulez juste pour remplacer certains blocs du modèle, vous devez également copier l'intégralité d'un modèle ad changement de bloc, qui est en fait pas très SÈCHE.

Quelqu'un connais un moyen de remplacer les orginales de modèle, alors qu'au même moment, de l'étendre, de sorte que vous avez juste à remplacer le bloc que vous voulez changer? (le truc c'est de faire cela sans changer le nom du template, parce que, dans certains cas, vous pourriez avoir à changer le point de vue de la faire fonctionner avec un autre modèle)

36voto

leech Points 2672

Je pense que la réponse de cette question est pertinente; actuellement, la meilleure solution semble être d'utiliser un modèle personnalisé chargeur de la django-apptemplate paquet sur PyPI, de sorte que vous pouvez simplement utiliser [pip][3] pour l'installer.

Le modèle de chargeur vous permet d'étendre un modèle dans une application spécifique; par exemple, pour prolonger la page d'index de l'interface admin, vous ajoutez

'apptemplates.Loader',

pour votre TEMPLATE_LOADERS liste dans settings.py, et l'utilisation

{% extends "admin:admin/index.html" %}

dans vos templates.

7voto

papirrin Points 572

Comme une mise à jour puisque cela semble être une question populaire. J'ai utilisé l' app overerextends sans aucun problème. Il fournit une nouvelle overextends de mots - clés qui permet d'étendre les modèles du même nom.

Et il est facile d'installer avec pip:

  pip install -U django-overextends
 

2voto

akaihola Points 10007

Dans le wiki Django, Simon Willison présente une astuce pour obtenir l'effet "modèle auto-extensible". Cependant, il n'est pas directement applicable si vous utilisez le chargeur de modèles app_directories .

Le fait de lier les répertoires de modèles d'applications dans un nouveau répertoire peut s'avérer utile.

-1voto

Paulo Scardine Points 17518

[mise à jour]

J'ai mal lu la question, ma réponse ne s'applique qu'à l'administrateur d'application, qui a un modèle intégré dans le mécanisme d'extension. Pour d'autres application qui n'a pas un tel mécanisme, je voudrais juste fourche les modèles d'origine au lieu de jongler avec le modèle personnalisé chargeurs comme la réponse choisie conseille. Si vous êtes inquiet au sujet de la fourche, vous pouvez également mettre en place un mécanisme d'extension et de contribuer en retour au projet initial si vous pensez qu'il vaut la peine.


[réponse originale à cette question]

Directement à partir de l'amende manuel: En raison de la conception modulaire des modèles d'administration, il est généralement ni nécessaire ni souhaitable de remplacer tout un modèle. Il est presque toujours préférable de remplacer uniquement la section du modèle dont vous avez besoin pour changer.

Pour continuer l'exemple ci-dessus, nous voulons ajouter un nouveau lien à côté de l'Histoire de l'outil pour le modèle de Page. Après avoir regardé change_form.html nous déterminons que nous avons seulement besoin de remplacer l'objet-outils de bloc. Voici donc notre nouveau change_form.html :

{% extends "admin/change_form.html" %}
{% load i18n %}
{% block object-tools %}
{% if change %}{% if not is_popup %}
  <ul class="object-tools">
    <li><a href="history/" class="historylink">{% trans "History" %}</a></li>
    <li><a href="mylink/" class="historylink">My Link</a></li>
    {% if has_absolute_url %}
        <li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">
            {% trans "View on site" %}</a>
        </li>
    {% endif%}
  </ul>
{% endif %}{% endif %}
{% endblock %}

Et c'est tout! Si nous avons placé ce fichier dans le templates/admin/my_app répertoire, notre lien apparaîtra sur chaque modèle de formulaire de modification.

-3voto

seddonym Points 624

Une façon simple de le faire, c'est ceci:

Disons que vous voulez étendre et remplacer django/contrib/admin/templates/admin/change_form.html.

Tout d'abord, la copie à l'original change_form.html pour votre app du répertoire de modèle et de le renommer comme quelque chose comme myapp/templates/admin/original_change_form.html. (Vous pourriez aussi le faire comme un lien symbolique.)

En Second lieu, créer votre propre change_form.html dans myapp/templates/admin. Au dessus de lui, mettre les éléments suivants:

{% extends "admin/original_change_form.html" %}

Simple!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X