11
votes

Inclure une vue dans un modèle

dans django j'ai une vue qui remplit un fichier HTML de modèle, mais dans le modèle HTML, je souhaite inclure une autre vue qui utilise un modèle HTML différent, comme:

{% block content %}
Hey {{stuff}} {{stuff2}}!

{{ view.that_other_function }}

{% endblock content %}


0 commentaires

3 Réponses :


9
votes

Oui, vous devez utiliser une étiquette de modèle pour le faire. Si tout ce que vous avez à faire est de rendre un autre modèle, vous pouvez utiliser une étiquette d'inclusion, ou éventuellement simplement l'{% intégré Inclure 'Chemin / To / Template.html'%}}

Les étiquettes de modèle peuvent faire tout ce que vous pouvez faire dans Python.

https: // docs. djangoproject.com/fr/3.0/howto/custom-template-tags/

[suivi] Vous pouvez utiliser la méthode render_to_string: xxx

Vous devez soit résoudre l'objet de demande dans le contexte, soit le faire sous l'argument de votre étiquette de modèle si vous avez besoin. Pour exploiter le contexte_instance.

Réponse de suivi: Inclusion Tag Exemple

Django s'attend à ce que les tags de modèle à vivre dans un dossier appelé «Templatetags» dans un module d'applications dans vos applications installées. ... xxx

Le balise d'inclusion rend un autre modèle, comme si vous avez besoin, mais sans avoir à appeler une fonction de vue. J'espère que ça vous va. Les documents sur les balises d'inclusion sont à: https: / /docs.djangoproject.com/fr/3.0/howto/custom-template-tags/#inclusion-tags


5 commentaires

Si j'utilise le {% intégré Inclure 'Chemin / TO / TEMPATEUR.HTML'%}} ne sera-t-il que rendant le modèle? Je veux que cela render_to_reesponse remplit le template.html puis l'inclure.


J'ai ajouté une réponse de suivi.


Je ne comprends pas complètement ce que vous voulez dire, j'ai importé rendu_to_string, mais je ne sais pas comment utiliser le contenu = ... Line DEF FOLEPAGE (Demande): retour Render_To_Response ("Modèles / TEMPLATE1.HTML" , {"Nom": "John Doe"}, context_instance = DemandeContext (Demande)) C'est à quoi ressemble ma vue, comment puis-je incorporer ce que vous avez dit?


À partir du code dans votre commentaire, vous pouvez simplement utiliser une balise d'inclusion, qui passe un dictionnaire à un modèle, et rend en place le contenu du modèle. J'ai édité ma réponse pour donner un exemple.


N'oubliez pas la réexécution python manage.py runserver après avoir créé votre premier templatetag personnalisé :)



2
votes

Utiliser votre exemple et votre réponse à la réponse de Brandon, cela devrait fonctionner pour vous alors:

template.html p> xxx pré>

vues.py p>

from django.http import HttpResponse
from django.template import Context, loader
from django.template.loader import render_to_string


def somepage(request): 
    other_content = render_to_string("templates/template1.html", {"name":"John Doe"})
    t = loader.get_template('templates/template.html')
    c = Context({
        'stuff': 'you',
        'stuff2': 'the rocksteady crew',
        'other_content': other_content,
    })
    return HttpResponse(t.render(c))


0 commentaires

1
votes

Quelqu'un a créé une balise de modèle que Charge une vue . Je l'ai essayé et ça marche. L'avantage d'utiliser cette étiquette de modèle est que vous n'avez pas à réécrire vos vues existantes.


0 commentaires