65 votes

Rendu d'objets JSON à l'aide d'un modèle Django après un appel Ajax

J'ai essayé de comprendre quelle est la meilleure façon de faire de l'Ajax dans Django. En lisant des trucs ici et là, j'ai compris que le processus commun est:

  1. formuler votre appel Ajax à l'aide de certains JavaScript bibliothèque (par exemple, jQuery), mettre en place un modèle d'URL dans Django qui intercepte l'appel et le passe à une fonction de visualisation

  2. dans le Python de la fonction de visualisation de récupérer les objets qui vous intéressent et de les envoyer au client au format JSON ou similaire (en utilisant le construit en sérialiseur module, ou simplejson)

  3. définir une fonction de rappel en JavaScript qui reçoit les données JSON et l'analyse, afin de créer n'importe quel HTML est nécessaire pour être affiché. Enfin, le script JavaScript met le code HTML où il doit le rester.

Maintenant, ce que je ne comprends toujours pas est comment sont les modèles Django liées à tout cela? Apparemment, nous ne faisons pas parti de la puissance de modèles à tous. Idéalement, j'ai pensé qu'il serait bien de passer de nouveau un objet JSON et un nom de modèle, de sorte que les données pourraient être itéré et un bloc HTML est créé. Mais peut-être que je suis totalement faux...

La seule ressource que j'ai trouvé qui va dans ce sens est de cet extrait (769) mais je n'ai pas encore essayé. Évidemment, ce qui va se passer dans ce cas, c'est que tous le HTML résultant est créé sur le serveur de l'autre côté, puis transmis au client. Le JavaScript-fonction de rappel n'a qu'à afficher dans le bon endroit.

Est-ce à cause des problèmes de performance? Sinon, même sans l'aide de l'extrait ci-dessus, pourquoi pas la mise en forme du code HTML directement dans le backend à l'aide de Python à la place du front-end?

Merci beaucoup!

Mise à JOUR: veuillez utiliser l'extrait de code 942 parce que c'est une version améliorée de celle ci-dessus! J'ai trouvé que l'héritage de soutien fonctionne beaucoup mieux de cette façon..

25voto

magicrebirth Points 731

Hey merci vikingosegundo!

J'aime utiliser des décorateurs trop :-). Mais en attendant, j'ai suivi la démarche proposée par l'extrait de code je le disais ci-dessus. Seule chose, utiliser à la place de l'extrait n. 942 parce que c'est une version améliorée de l'originale. Voici comment il fonctionne:

Imaginez que vous avez un modèle (par exemple, 'subtemplate.html'), quelque soit la taille qui contient un utile bloc que vous pouvez réutiliser:

     ........
	<div id="results">			
		{% block results %}
			{% for el in items %}
		           <li>{{el|capfirst}}</li>
			{% endfor %}
		{% endblock %}		
	</div><br />
     ........

Par l'importation de votre fichier de vue de l'extrait ci-dessus, vous pouvez facilement référence à un bloc dans vos templates. Une fonctionnalité intéressante est que l'héritage des relations entre les modèles sont pris en compte, donc si vous faites référence à un bloc qui comprend un autre bloc et ainsi de suite, tout devrait fonctionner parfaitement. Ainsi, l'ajax vue ressemble à ceci:

from django.template import loader
# downloaded from djangosnippets.com[942]
from my_project.snippets.template import render_block_to_string

def ajax_view(request):
    # some random context
    context = Context({'items': range(100)})
    # passing the template_name + block_name + context
    return_str = render_block_to_string('standard/subtemplate.html', 'results', context)
    return HttpResponse(return_str)

13voto

vikingosegundo Points 30323

Voici comment j'utilise le même modèle pour le rendu traditionnel et le rendu avec réponse Ajax.

Modèle:

 <div  id="sortable">

{% include "admin/app/model/subtemplate.html" %}
</div>
 

Modèle inclus (aka: sous-modèle):

 <div id="results_listing">
{% if results %}
    {% for c in results %}
        .....
    {% endfor %}
{% else %}
 

La vue Ajax:

 @login_required
@render_to('admin/app/model/subtemplate.html')#annoying-decorator
def ajax_view(request):
    .....

    return { 
        "results":Model.objects.all(),
    }
 

Bien sûr, vous pouvez utiliser render_to_response. Mais j'aime ces décorateurs ennuyeux: D

7voto

Daniel Roseman Points 199743

Il n'y a aucune raison pour que vous ne puissiez pas restituer un bit HTML rendu avec Ajax et l'insérer dans la page existante à l'endroit souhaité. Vous pouvez évidemment utiliser les modèles de Django pour rendre ce code HTML, si vous le souhaitez.

6voto

Anurag Uniyal Points 31931

Quand vous faites Ajax je ne pense pas que vous avez toute utilisation pour les modèles. Le modèle est-il de sorte que vous pouvez générer de l'HTML dynamique côté serveur facilement et par conséquent, il ne donne que peu de programmation des crochets à l'intérieur du HTML.

Dans le cas d'Ajax, vous transmettez les données JSON et vous pouvez les mettre en forme comme vous le souhaitez en Python. et HTML/éléments de document sera généré sur le côté client en utilisant le format JSON par certains de la bibliothèque JavaScript par exemple jQuery sur le côté client.

Peut-être que si vous avez un cas très spécifique de remplacer une partie de l'intérieur HTML côté serveur HTML, alors peut-être vous pouvez utiliser des modèles, mais dans ce cas pourquoi vous avez besoin de JSON? Vous pouvez simplement des requêtes sur la page HTML via Ajax et le changement interne ou externe, ou de quoi que HTML.

3voto

Weiss I Nicht Points 31

Alors que les modèles sont en effet tout simplement pour des raisons de présentation, il ne compte pas si vous le faites sur le server-side ou côté client. Il s'agit d'une séparation entre la logique de commande qui est de l'exécution d'une action, à partir de la logique de la vue qui est seulement responsable de la création de l'annotation. Si votre code javascript de la logique de contrôle est d'avoir à gérer de la façon dont vous êtes rendu ou d'afficher le code HTML, alors vous pourriez être faire de mal, mais si vous isoler que de la logique rendu à un autre objet ou de la fonction, et juste en passant les données nécessaires pour le rendu, alors vous devriez être très bien; il reflète la manière dont nous séparer de nos contrôleurs, modèles et points de vue sur le côté serveur.

Jetez un oeil au projet github: http://github.com/comolongo/Yz-Javascript-Django-Template-Compiler

Il compile des modèles django optimisée des fonctions javascript qui permettra de générer votre présentation html avec les données que vous transmettez. Les fonctions compilées sont en pur javascript, donc il n'y a pas de dépendances sur d'autres bibliothèques. Depuis les modèles sont compilés au lieu d'être analysée au moment de l'exécution, les cordes et les variables sont tous placés dans les chaînes de caractères javascript qui a juste besoin d'être concaténés, de sorte que vous obtenez une énorme augmentation de la vitesse par rapport à des techniques qui nécessitent de faire de manipulation du dom ou un script d'analyse pour obtenir la présentation finale. Pour l'instant seuls la base de balises et de filtres sont là, mais devrait être suffisant pour la plupart des choses, et de plusieurs points seront ajoutés à mesure que les gens commencent à faire des demandes pour eux ou pour commencer à contribuer au projet.

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