ajax

2016-06-17 23 views
5

ile html'ye veri oluşturmak için en iyi yöntem Bir öğenin bazı ayrıntılarını, önceden tanımlanmış bir bölüme, bu öğenin üzerine tıklatmaya çalışıyorum. Bunu yapmanın 2 yolu var.ajax

Not: Ben ön ucu

I. My First yolu içinde piton/arka uç olarak Django ve jquery kullanıyorum

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. Diğer bir yol

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>" 
       ); 
     } 
    }); 
}); 

Hem süreç işler arasında. Ben önceden html oluşturma ve bunu yüklerken sonra html oluşturmak için piton kodu kullanarak ve gibi iyi bir seçim olmayabilir yüklenirken düşündük. Aynı url'e farklı bir uygulamadan erişmeyi deneyecek olsam da işe yaramıyor. Json yanıtından veri ayıklamak suretiyle jquery'den html oluşturmak iyi bir çözüm gibi görünüyor, ancak bazen veriler çok büyük olduğunda kullanıcının ucunda daha fazla ram gerekiyor, bu da sistemi yavaşlatıyor.

Hangisinin kullanılacağı konusunda kafam karıştı, lütfen bu ikisinden daha iyi bir çözüm öner. Ayrıca varsa, başka bir çözüm daha iyi öneriyoruz?

Şimdiden teşekkürler.

+1

Benim düşünceme göre, ne kadar HTML oluşturduğunuza ve ne sıklıkta yaptığınıza bağlı. Örneğin, eğer sadece küçük bir '' render ederseniz, o zaman yaptığınız gibi iyidir. Ancak, büyük bir HTML oluşturmaya ihtiyaç duyduysanız, [Handlebars] (http://handlebarsjs.com/) –

+0

Javascript = istemci işleme gibi bir şablon motoru kullanmak daha iyi olurdu. Php = Sunucu geçişi. İyi bir sunucunuz varsa, ikinci kullanıcı için daha iyi olacaktır. Birçok kullanıcının hala eski PC'leri var, ya da iş için, özellikle bir geliştiricinin PC'sine kıyasla düşük güçle çalışan PC'ler olarak düşünülebilir. Müşteri üzerinde çok fazla çalışmak performansı/UX'i öldürebilir. –

+0

Daha büyük bir HTML'niz varsa, başka bir deyişle, get_item_data'daki şablonu tanımlayabilir ve bu şablonu döndürebilirsiniz –

cevap

0

Şablon, iş ve js mantığını mümkün olduğunca ayırmayı tercih ediyorum. Django tasarım ilkeleri içinde daha pythonic ve daha fazlasını tutar. Bu gerçekten ilk yönteminize oldukça benzer, ancak görünümünüzdeki bir dizgeye html yazdırmak yerine bir html şablonu kullanır.

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

Gidon olduğunu ben aslında kullanmak ne
$('#myid').on('click', function(){ 
    $.ajax({ 
     type: "GET", 
     url: GET_DATA, 
     data: dataString, 
     success: function(res) { 
      $('#addl_container').html(res); 
     } 
    }); 
}); 
+0

görüntüden ayırmaktır. Sorun, bu bir api url ise ve ben başka bir siteden erişmek istediğimde sadece json yanıtı vs html istiyorum. –

+0

Sorun değil, hala verilerinize 'return HttpResponse (json.dumps (data))' kullanabilirsiniz. Amacını bildiğiniz sürece, her iki şekilde de gidebilir ve buna göre ayarlayabilirsiniz. Bu arada harika bir soru –

0

çok kaba taslak,:

Django şablonunda

. kafa:

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

uygulama/mydiv.handlebars.JS böyle 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 %} 

şey:

_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); 
); 

Ben ayrıntıları templating Gidonu gitmedi, ama onlar çok Django şablonlarına benzer% 80, etiket ve filtreler eksi yeterince kolay yapmalısın.

Gidon'ların kullanılmasının ek bir yararı, istemcideki sprintf/python-type dize değiştirmelerini sağlayabilmesidir. Bu kullanım için ağır bir tür, ama eğer zaten varsa ...