2015-11-02 100 views
1

我剛剛啓動了一個使用Django和HTML/Javascript模板的Web應用程序。FOR循環通過JS腳本中的Django模型

我的Django spot應用程序包含一個發送到HTML模板的Spot模型 - 用於Google Map Api。在循環包含Spot.objects.all()的變量spots時,我遇到了問題。 看來問題來自我將數據發送到HMTL文件的方式。


----------------------------------------- Spot Django -app:models.py --------------------------------------------

class Spot(models.Model): 
    idn = models.IntegerField(unique = True) 
    name = models.CharField(max_length = 200) 
    longitude = models.FloatField() 
    latitude = models.FloatField() 

------------------------------------------- ------ HTML/JS ----------------------------------------- ------

<script type="text/javascript"> 
    var IDs = [] 
    var names = [] 
    var lat = [] 
    var lng = [] 

    { % for spot in spots % } 
     IDS.push({{spot.idn}});  
     names.push({{spot.name}}); 
     lat.push({{spot.latitude}}); 
     lng.push({{spot.longitude}}); 
    { % endfor % } 

然後,列表中不包含任何可以在以後使用的數據。更糟糕的是,如果names.push({{spot.name}})未被評論,則HTML文件不起作用。

----------------------------------------- Spot Django-app: views.py --------------------------------------------

from spots.models import Spot 
def index(request): 
    return render(request, 'index.html', {'spots':Spot.objects.all()}) 

由於其他計算器問題(見下表),我也試圖序列化Spot.objects.all()要麼django.core.serializers.serialize("json", Spot.objects.all())或創建我自己的串行器(感謝Django_REST)。問題依然存在。那麼,我用JS解析數據的方式會出現問題嗎?

我已經看下面的鏈接:

沒有成功。因此,如果答案是包含或涉及到這些話題,你能不能解釋我的東西我一直在各地的天...

編輯: 問題是複數:

  • 序列化數據(或沒有,我沒有現在,但大家誰回答同意說,這是更好的)
  • {{ spot.name }}添加引號'{{ spot.name }}',只有非整數/浮點模型(即只有models.CharFields字段)
  • 谷歌地圖API可用於一些(經度,緯度)的元組返回即使被明確定義
+1

您需要更好地描述「這些列表中不包含任何以後可以使用的數據」的含義。你究竟得到了什麼?您可以添加一個console.log來查看您從循環中獲得的內容。 – dkarchmer

回答

1

由於大括號和百分比之間有空格,因此Django將無法識別這些模板標記。所以,根本沒有循環。你需要將它們寫在正確的格式:

{% for spot in spots %} 
    ... 
{% endfor %} 

一旦你這樣做,你會開始得到各種JS語法錯誤的,因爲你沒有用引號包裹您的任何數據。但是,正如評論所說,把它當做JSON會好很多。

+0

其實,我的代碼並沒有包含這些空格 - 我添加了它們認爲它會更清晰 並且將缺少的引號添加到' {spot.name}}'也沒有幫助,那麼序列化會怎樣呢? –

1

即使是我認爲你的串行數據轉換成JSON是更好的主意錯誤。您的JavaScript代碼不起作用,例如{{ spot.name }}將呈現原始字符串,所以爲了理解它,你需要把它放在引號中(當然每行之後還有分號)。

names.push('{{spot.name}}'); 
+0

正如我在編輯中提到的那樣,它只通過'models.CharField'字段進行工作,而不是'models.IntegerField'和'models .FloatField'('spot.idn','spot.latitude','spot.longitude')。它是「正常的」,我的意思是我應該強制我的float和interger值在讀取時是字符串,然後用JS函數將它們變成float? –

+0

這裏的要點是,在模板中,Django正在渲染值,所以你正在丟失類型。例如,通過使用[USE_THOUSAND_SEPARATOR](https://docs.djangoproject.com/en/1.8/ref/settings/#use-thousand-separator),你可能會得到格式不能被javasacript函數識別的浮點數,等等。更好的將它序列化爲json,因爲json是javascript的格式JSON = JavaScript對象表示法 – beezz