2011-04-02 5 views
0

Actuellement, j'essaie de créer plusieurs vues pour une requête. Pour 1 vue, je fais ceci:La fonction render_to_response de Django imbriquée affiche toujours le type de contenu

return render_to_response(
    "/index/index.html", 
    {} 
) 

Et maintenant, lorsque je tente d'ajouter une colonne « gauche » à index.html, je dois le mettre sur point de vue différent (parce que je dois appliquer la même technique sur un autre endroit aussi), voici comment je le fais:

leftCol = direct_to_template(request,settings.viewPath + "/columns/left.html",{}) 
return render_to_response(
    "/index/index.html", 
    { 
    'leftColumn': leftCol, 
    } 

le code fonctionne bien, mais la sortie est pas ce que je pensais. Le LeftCol montre l'en-tête de réponse au début de sa sortie:

"Content-Type: text/html; charset = utf-8"

Comment puis-je supprimer cet en-tête? J'ai essayé de modifier le content_type et le mimetype dans le paramètre mais cela n'a pas fonctionné.

+0

le LeftCol utilisait direct_to_template, avant qu'il ne soit render_to_response aussi bien. Mais le résultat est le même. – kecebongsoft

+0

lire les documents sur le contenu de rendu: http://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context une autre approche pourrait être d'utiliser une balise template ou include (directement au template niveau) – Jerzyk

Répondre

4

C'est parce que direct_to_template() renvoie un HttpResponse, pas une chaîne. Avez-vous envisagé d'utiliser une fonctionnalité de modèle, par ex. l'étiquette de modèle {% include %}, ou en écrivant une balise de modèle de votre choix?

Si vous insistez sur les modèles de pré-rendu dans votre vue, puis que vous les combinez dans votre modèle, restituez le modèle vous-même plutôt que d'utiliser direct_to_template(). par exemple.

from django.template.loader import get_template 
from django.template import RequestContext 

def someview(request): 
    leftCol = get_template(settings.viewPath + "/columns/left.html").render(RequestContext(request) 
    render_to_response("/index/index.html", {'leftColumn': leftCol}) 
+0

Oui, une balise de gabarit - en particulier, une balise d'inclusion - est la meilleure option. –

4

Utilisez render_to_string (http://docs.djangoproject.com/en/dev/ref/templates/api/#the-render-to-string-shortcut) pour obtenir une chaîne de retour après avoir rendu un modèle. Vous pouvez également utiliser un {% include %} pour inclure un modèle dans le même contexte que le modèle actuel (mais cela reste manuel). Encore mieux serait d'avoir un modèle de base dont vous héritez en utilisant {% extends 'base.html' %} qui inclura juste la fonctionnalité de modèle commun que vous pouvez remplacer à votre volonté en utilisant {% block %} et vous permet d'omettre le contenu du modèle dupliqué comme une colonne de gauche.

+0

En cours de vote. Le était exactement ce dont j'avais besoin pour rendre une balise de modèle à ma page 404 par défaut. Impressionnant. – mkoistinen

0

La fonction 'render_to_response' renvoie un objet HttpResponse. Au lieu de renvoyer l'objet lui-même, vous pouvez retourner son attribut de contenu pour accéder uniquement à la sortie que vous souhaitez afficher.

à savoir

response = render_to_response(
    "/index/index.html", 
    { 
    'leftColumn': leftCol, 
    } 
return response.content 
Questions connexes