2016-06-17 31 views
5

Ich versuche, einige Details eines Artikels in einigen bereits definierten div zu öffnen. Ich habe 2 Möglichkeiten, das zu tun.Best Practice für das Rendern von Daten in HTML mit Ajax

Hinweis: Ich verwende Python/Django als Backend und Frontend jquery in

I. Mein erster Weg

Views.py

def get_item_data(id): 
    obj = MyClass.objects.get(pk=id) 
    html = """ 
       <div>All Details Here, 1. {0}, 2. {1}</div> 
      """.format(str(obj.id), str(obj.name)) 

    return HttpResponse(html) 

myapp.js

$('#myid').on('click', function(){ 
    $.ajax({ 
     type: "GET", 
     url: GET_DATA, 
     data: dataString, 
     success: function(res) { 
       $('#addl_container').html(res); 
     } 
    }); 
}); 

II. Der andere Weg

Views.py

def get_item_data(id): 
    obj = MyClass.objects.filter(pk=id).values() 
    return HttpResponse(simplejson.dumps(obj)) 

myapp.js

$('#myid').on('click', function(){ 
    $.ajax({ 
     type: "GET", 
     url: GET_DATA, 
     data: dataString, 
     success: function(res) { 
       $('#addl_container').html(
        "<div>All Details Here, 1. "+ res.id +", 2. "+ res.name + "</div>" 
       ); 
     } 
    }); 
}); 

Beide der Prozess funktioniert. Ich dachte, das Erstellen des HTML im Voraus und das Laden ist möglicherweise keine gute Wahl, da wir Python-Code verwenden, um das HTML zu erstellen und dann zu laden. Es wird auch nicht funktionieren, wenn ich versuche, von einer anderen Anwendung auf dieselbe URL zuzugreifen. Das Erstellen des HTML aus jQuery durch Extrahieren von Daten aus der JSON-Antwort scheint eine gute Lösung zu sein, aber manchmal, wenn die Daten riesig sind, benötigt es mehr RAM am Ende des Benutzers, was das System verlangsamt.

Ich bin verwirrt, welche zu verwenden, bitte vorschlagen eine bessere Lösung aus diesen beiden. Schlagen Sie auch andere Lösung besser als diese vor?

Vielen Dank im Voraus.

+1

Meiner Meinung nach hängt es davon ab, wie viel HTML Sie und wie oft rendern. Wenn Sie zum Beispiel nur eine kleine "" rendern müssen, dann ist die Art, wie Sie es tun, in Ordnung. Aber wenn Sie etwas großen HTML rendern müssten, dann wäre es besser, eine Template-Engine wie [Handlebars] (http://handlebarsjs.com/) –

+0

Javascript = Client-Verarbeitung zu verwenden. PHP = Server-Verarbeitung. Wenn Sie einen anständigen Server haben, wird der zweite für den Benutzer besser sein. Viele Benutzer haben immer noch relativ alte PCs oder, was die Arbeit betrifft, was man als unterentwickelte PCs ansehen könnte, besonders im Vergleich mit einem Entwickler-PC. Wenn zu viel auf dem Client ausgeführt wird, kann Performance/UX beendet werden. –

+0

Ein anderer Weg, wenn Sie einen größeren HTML haben, dann können Sie Vorlage in 'get_item_data' definieren und diese Vorlage zurückgeben –

Antwort

0

Ich bevorzuge es, die Vorlage, Geschäft und js Logik so viel wie möglich zu trennen. Es hält es mehr Python und mehr innerhalb der Django-Design-Prinzipien. Dies ist in der Tat sehr ähnlich zu Ihrer ersten Methode, aber verwendet eine HTML-Vorlage, anstatt HTML auf eine Zeichenfolge in Ihrer Ansicht zu drucken.

views.py

def get_item_data(id): 
    template_name = 'index.html' 
    obj = MyClass.objects.get(pk=id) 
    context = { 
     'obj': obj, 
    } 
    html = render_to_string(template_name, context) 
    return HttpResponse(html) 

index.html

<h1>{{ obj }}</h1> 

myapp.js

$('#myid').on('click', function(){ 
    $.ajax({ 
     type: "GET", 
     url: GET_DATA, 
     data: dataString, 
     success: function(res) { 
      $('#addl_container').html(res); 
     } 
    }); 
}); 
+0

Das Problem hier ist, wenn dies eine API-URL ist und ich möchte von einer anderen Website darauf zugreifen, ich möchte nur JSON-Antwort vs HTML. –

+0

Das ist in Ordnung, Sie können 'return HttpResponse (json.dumps (data))' auf Ihren Daten verwenden. Ich denke, solange du den Zweck kennst, kannst du in beide Richtungen gehen und dich entsprechend anpassen. Große Frage übrigens –

0

sehr groben Entwurf, von dem, was ich wirklich, das ist Lenker:

in Django Vorlage. Kopf:

<!--Handlebar templates start--> 
{% include "app/mydiv.handlebars.html" %} 
<!--Handlebar templates end--> 

app/mydiv.handlebars.html

{% verbatim %} 
<script id="template-myapp-my-div" type="text/x-handlebars-template"> 
<div>All Details Here, 1.{{res.id}} res.id, 2. {{res.name}}</div> 
</script> 
{% endverbatim %} 

So etwas wie dies in JS:

_success = function(json_data_from_response) { 
var templateSource = $("#template-myapp-mydiv").html(); 
if (!templateSource) { 
    $("#errors").html("template-myapp-mydiv:error:no template found"); 
    return; 
} 
// you could compile ahead of time elsewhere or cache the compile. 
var template = Handlebars.compile(templateSource); 

// now merge your incoming data. 
var myhtml = template(json_data_from_response); 
$("#addl_container").html(myhtml); 
); 

ich nicht in den Lenker ging Details Templating, aber sie sind 80% ähnlich wie Django-Vorlagen, minus den Tag und Filter, so Du solltest es leicht genug machen.

Ein zusätzlicher Vorteil der Verwendung von Handlebars ist, dass es im Client Sprintf/Python-String-Substitutionen bereitstellen kann. Art von Schwergewicht für diesen Zweck, aber wenn Sie es trotzdem haben ...

//compute an actual url on the fly from a template (i.e. depending on 
//what the user clicked on, I compute what to fetch) 

var _url = _settings.url_details_base; 
var t_url = Handlebars.compile(_url); 
var url = t_url({"CREF": CREF,"rdbname" : rdbname}); 

//do something with url, like an Ajax call.