web-dev-qa-db-fra.com

Django comment rendre partiellement

Comment appeler une méthode de vue à partir d'un niveau de modèle comme le rendu partiel dans RoR? Le problème est parfaitement illustré dans ce blog . Je peux utiliser include pour inclure des modèles dans les modèles, mais je devrais alors faire correspondre tous les noms de variables entre les couches de modèles. Je voudrais vraiment inclure des vues dans les modèles et les couches de découplage. Le blog a été écrit il y a un an. Y a-t-il une meilleure solution depuis?

Merci

40
xster

Les balises de modèle sont certainement le moyen de le faire dans Django. Si vous avez besoin de transmettre des éléments spécifiques à un modèle et de simplement lui rendre le contenu, vous pouvez utiliser les balises d'inclusion intégrées, qui acceptent les variables qui leur sont transmises.

Maintenant, avec balises d'inclusion , vous devez spécifier le chemin d'accès au modèle à rendre. Django ne trouvera pas automatiquement /your_app/views/_my_partial.html.erb comme dans Rails.

Consultez les documents et voyez si cela fera ce dont vous avez besoin. Sinon, vous pouvez toujours écrire le vôtre.

12
Brandon

Je pense que vous cherchez {% include '_partial.html' %}.

58
Alireza Savand

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#include

Si vous utilisez l'argument "avec" lorsque vous incluez un partiel, vous n'avez pas besoin de faire correspondre les variables - Vous pouvez renommer une variable avant d'inclure un modèle. J'ai trouvé que cette technique me permet de créer des modèles beaucoup plus réutilisables. C'est aussi beaucoup moins de travail que de créer des balises d'inclusion. Par exemple:

{% include 'partials/blog_entry.html' with blog_entry=my_blog_entry %}
28
Michael Bylstra

J'ai adapté cet extrait et l'ai rendu disponible en package pypi .

  1. pip install Django_render_partial

  2. Ajouter 'Django_render_partial' à INSTALLED_APPS

  3. Veiller à ce que 'Django.template.context_processors.request' est dans TEMPLATES['OPTIONS']['context_processors']

  4. Utilisation {% render_partial %} tag dans votre modèle:

{% load render_partial %}

{# using view name from urls.py #}    
{% render_partial 'partial_view' arg1=40 arg2=some_var %}

{# using fully qualified view name #}
{% render_partial 'partial_test.views.partial_view' arg1=40 arg2=some_var %}

{# class based view #}
{% render_partial 'partial_test.views.PartialView' arg1=40 arg2=some_var %}

Un projet de test contenant ces exemples est disponible sur GitHub.

4
utapyngo