Django-fr

Forum

#1 04-07-2012 20:18:38

M. Namgyal Brisson
Membre
Inscription : 07-03-2012
Messages : 8

Re: [afpy/django] comment écrire un template xml?

Note

If you're using Django's
render_to_response()<https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render_to_response>
shortcut
to populate a template with the contents of a dictionary, your template
will be passed a Context instance by default (not a RequestContext). To use
a RequestContext in your template rendering, pass an optional third
argument to render_to_response()<https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render_to_response>:
a RequestContext instance. Your code might look like this:

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

https://docs.djangoproject.com/en/dev/ref/templates/api/

L'utilisation d'un dictionnaire fusionné avec le context ne me semble pas
approprié, je ne l'ai jamais vu employé comme cela, mais je n'ai pas la
science infuse ...

def main_formation(request, formation_id):
    formations = Formation.objects.get(id=formation_id)
    variables = RequestContext(request, {
        'formations': formations
        })
    return render_to_response('saisie/formation.xml', variables)

Le 4 juillet 2012 20:35, M. Namgyal Brisson <
namgyal.brisson _AT_ app-concept-lab.fr> a écrit :

> Bonsoir,
>
> La fonction :
>
> def main_formation(request, formation_id):
>     formations = Formation.objects.get(id=formation_id)
>     variables = RequestContext(request, {
>         'formations': formations
>         })
>     return render_to_response('saisie/formation.xml', variables)
>
> comporte à mon sens quelques erreurs!
>
> la fonction, sauf erreur de ma part, 'render_to_response()' est mal
> utilisée.
>
> Elle prend les paramètres
>
> 1. template -> str
>
> 2. dictionnaire de données -> dict
>
> 3. (optionnel) le RequestContext ou le mime type
>
> cf doc, qui est d'ailleurs très bien renseignée à ce sujet !!!
>
>
> https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render_to_response
>
>
>  Le 4 juil. 2012 19:42, "Eric Francis" <frncseric _AT_ gmail.com> a écrit :
>
> Bonjour,
>> Je souhaite écrie une fonction me permettant de remplir un template xml.
>> Mai j'ai des problème au niveau du passage de l'objet httpReponse. Bref
>> voici mon ode
>> Fonction écrit dans le fichier views.py
>>
>> [i]
>> def main_formation(request, formation_id):
>>     formations = Formation.objects.get(id=formation_id)
>>     variables = RequestContext(request, {
>>         'formations': formations
>>         })
>>     return render_to_response('saisie/formation.xml', variables)
>> [/i]
>>
>> Voici mon fichier template que je souhaite remplir
>>
>> [i]
>> <cdm:CDM xmlns:cdm="http://cdm-fr.fr/2006/CDM-frSchema"
>>          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>          xsi:schemaLocation="http://cdm-fr.fr/2006/CDM-frSchema
>> [url=
>> http://cdm-fr.fr/2006/schemas/CDM-fr.xsd\]http://cdm-fr.fr/2006/schemas/CDM-fr.xsd\
>> "[/url]
>> language="fr-FR">[/i]
>>
>> [i]{% if formations %}
>>   <cdm:orgUnitName>
>>                 <cdm:text language="fr-FR">[b] {{ formation.etablissement
>> }}[/b]
>> </cdm:text>
>>         </cdm:orgUnitName>
>>         <cdm:orgUnitAcronym>[b]{{ formation.sigle
>> }}[/b]</cdm:orgUnitAcronym>
>>         <cdm:contacts>
>>                 <cdm:contactData>
>>                         <cdm:adr>
>>                                 <cdm:locality>[b] {{ formation.ville
>> }}[/b] </cdm:locality>
>>                                 <cdm:country>[b] {{ formation.pays }}[/b]
>> </cdm:country>
>>                         </cdm:adr>
>>                 </cdm:contactData>
>>         </cdm:contacts>[/i]
>>
>> [i]</cdm:CDM>
>> {% endif %}
>> [/i]
>> Merci d'avance à toute personne pouvant me donné quelques indications.
>> _______________________________________________
>> django mailing list
>> django _AT_ lists.afpy.org
>> http://lists.afpy.org/mailman/listinfo/django
>>
>

Hors ligne

#2 04-07-2012 23:47:56

frncseric
Membre
Inscription : 03-07-2012
Messages : 10

Re : Re: [afpy/django] comment écrire un template xml?

Salut,
Merci pour votre aide. Mon véritable problème semble être mon fichier template qui doit être en xml. En effet, tel que envoyé dans mon premeir poste, mon fichier doit être en xml.  S'il vous plait, au cas où vous avez un moyen de le généré autrement, ou même le sauvegardé directement un fichier au format xml, je suis preneur.
Je ne voie pas d'exemple qui permet de remplir un fichier au format xml avec les éléments du dictionnaire; et c'est ce qui me faut.
il me faut peut être cherché une autre fonction, mais je ne sais laquelle. le resultats sur la documentation avec le mot clé "xml" ne donne pas grand chose.
Dans la fonction ci-dessous

return render_to_response('my_template.html',    my_data_dictionary,  context_instance=RequestContext(request))

Mon template n'est pas un fichier html, je le veux en xml. Mon dictionaire tel que sipécifier marche bien avec un fichier html. Mais comment faire pour uin fichier xml??
Merci pour votre aide

Hors ligne

#3 05-07-2012 00:02:28

M. Namgyal Brisson
Membre
Inscription : 07-03-2012
Messages : 8

Re : Re: [afpy/django] comment écrire un template xml?

Peut être cela pourra t il vous aider ?!!

Example <https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#id3>

The following example renders the template myapp/index.html with the MIME
type *application/xhtml+xml*:

from django.shortcuts import render_to_response
def my_view(request):
    # View code here...
    return render_to_response('myapp/index.html', {"foo": "bar"},
        mimetype="application/xhtml+xml")

This example is equivalent to:

from django.http import HttpResponsefrom django.template import Context, loader
def my_view(request):
    # View code here...
    t = loader.get_template('myapp/template.html')
    c = Context({'foo': 'bar'})
    return HttpResponse(t.render(c),
        mimetype="application/xhtml+xml")

https://docs.djangoproject.com/en/dev/topics/http/shortcuts/
http://www.djangobook.com/en/beta/chapter11/

Si vous cherchez à générer un flux rss, d'autres méthodes sont incluses
dans le framework :

https://docs.djangoproject.com/en/dev/ref/contrib/syndication/?from=olddocs/


Le 5 juillet 2012 00:47, Eric Francis <frncseric _AT_ gmail.com> a écrit :

> Salut,
> Merci pour votre aide. Mon véritable problème semble être mon fichier
> template qui doit être en xml. En effet, tel que envoyé dans mon premeir
> poste, mon fichier doit être en xml.  S'il vous plait, au cas où vous
> avez un moyen de le généré autrement, ou même le sauvegardé
> directement un fichier au format xml, je suis preneur.
> Je ne voie pas d'exemple qui permet de remplir un fichier au format xml
> avec les éléments du dictionnaire; et c'est ce qui me faut.
> il me faut peut être cherché une autre fonction, mais je ne sais
> laquelle. le resultats sur la documentation avec le mot clé "xml" ne donne
> pas grand chose.
> Dans la fonction ci-dessous
>

> return render_to_response('my_template.html',    my_data_dictionary,
> context_instance=RequestContext(request))
>

> Mon template n'est pas un fichier html, je le veux en xml. Mon dictionaire
> tel que sipécifier marche bien avec un fichier html. Mais comment faire
> pour uin fichier xml??
> Merci pour votre aide
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#4 05-07-2012 07:53:05

Julien Bouquillon [revolunet]
Membre
Inscription : 07-10-2011
Messages : 22

Re : Re: [afpy/django] comment écrire un template xml?

Hello

Une autre possibilité c'est aussi d'utiliser le serializer xml intégré dans
django mais tu n'as pas le choix de la structure :

dans ta vue, il te suffit de mettre :

from django.core import serializers

xml_serializer =
serializers.get_serializer("xml")()xml_serializer.serialize(queryset,
stream=response)


Julien.

Hors ligne

#5 05-07-2012 11:34:21

frncseric
Membre
Inscription : 03-07-2012
Messages : 10

Re : Re: [afpy/django] comment écrire un template xml?

Salut,
Merci pour votre aide. Je viens de résoudre le problème. La fonction

return render_to_response('myapp/index.html', {"foo": "bar"},
        mimetype="application/xhtml+xml")

marche bien. En fait, j'avais une erreur au niveau de mon query  qui ne retournait pas d'objets. Et du coup, mon dictionnaire était vide.
Je souhaite maintenant que ce fichier soit directement disponible en en sortir téléchargéable et c'est autre chose.
Merci pour toutes vos réponses.

Hors ligne

#6 05-07-2012 14:00:29

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Re: [afpy/django] comment écrire un template xml?

Le jeudi 05 juillet 2012 12:34:21, Eric Francis a écrit :
> Salut,
> Merci pour votre aide. Je viens de résoudre le problème. La fonction
>

return render_to_response('myapp/index.html', {"foo": "bar"},
>         mimetype="application/xhtml+xml")

> marche bien. En fait, j'avais une erreur au niveau de mon query  qui ne
> retournait pas d'objets. Et du coup, mon dictionnaire était vide.
> Je souhaite maintenant que ce fichier soit directement disponible en en
> sortir téléchargéable et c'est autre chose.
> Merci pour toutes vos réponses.
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django


Il faut que ta réponse renvoi un header précisant que c'est obligatoirement un
fichier à télécharger et non un contenu à afficher, donc modifier ta ligne de code
:

    response = render_to_response('myapp/index.html', {"foo": "bar"},
mimetype="application/xml")
    response['Content-Disposition'] = 'attachment; filename=monfichier.xml'
    return response

Tu récupères le "HttpResponse" retourné par render_to_response, et tu lui
ajoute l'attribut 'Content-Disposition' (le fameux header de ta réponse), puis
tu retournes ta réponse modifiée.

J'ai modifié le mimetype, parce qu'en théorie le xhtml/xml pour du simple XML
c'est inutile et d'après le XML que tu a donné en exemple, je n'en vois pas de
nécessité.

Note aussi qu'en général on préfère rédiger une sortie XML avec une lib XML
qui t'évitera de générer du XML incorrect et renvoyer le contenu directement
vers un HttpResponse sans utiliser de templates.

Hors ligne

#7 06-07-2012 13:11:49

frncseric
Membre
Inscription : 03-07-2012
Messages : 10

Re : Re: [afpy/django] comment écrire un template xml?

Bonjour,
Merci  David Thenon pour votre réponse.
Votre indication marche bien.
Note aussi qu'en général on préfère rédiger une sortie XML avec une lib XML
qui t'évitera de générer du XML incorrect et renvoyer le contenu directement
vers un HttpResponse sans utiliser de templates.

Effectivement, vous avez raison. Pour l'instant, la structure de mon fichier xml est un peu statique, mais il est mieux, pour les besoin de maintenance et d'évolution de mon code, d'utiliser les librairie xml. Toutefois, je n'ai pas assez de connaissances dans python - xml. Je vais m'y mettre pour les prochaines phase de mon projet.
Merci pour votre aide.

Hors ligne

Pied de page des forums