2013-10-18 114 views
1

models.py訪問字典/對象

class farm_model(models.Model): 
    name=models.CharField(max_length=30) 

views.py

def farms(request): 
farms=farm_model.objects.all() 
context = { 'farms': farms } 
return render(request, 'farms.html', context) 

farms.html

{% for farm in farms %} 
<div style="top: {{ farm.map_top }}px; left: {{ farm.map_left }}px;">{{ farm.name }}</div> 

如何添加map_top和map_left農場對象來自views.py? 我已經tryied

farms[0].map_top=80 
setattr(farms[0],'map_top',80) 

,但它不工作

我第二次的形式給出了在views.py

farm_web_data={} 
farm_web_data[1]={} 
farm_web_data[1]['map_top']=80 

設置,但我不知道如何從訪問這些陣列template

{% for farm in farms %} 
<div style="top: {{ farm_web_data.{{ farm.pk }}.map_top }}px; 

不工作

什麼想法? 我不想map_top存儲在DB

+0

你是如何計算'map_top'和'map_left'?對於列表中的第二個農場,兩者的價值是什麼? –

+0

這將是固定值。例如,我只爲第一個農場設置了map_top,但是在實際的視圖中。py和template有所有的值 – luzik

+0

好吧,準備一個字段,以farm ID作爲關鍵字,將它與上下文一起傳遞並寫一個[Custom Template Tag](https://docs.djangoproject.com/en/dev/howto/custom-template-tags /)獲取模板中相應農場的值 –

回答

2

與你第一次嘗試的問題是,切片一個QuerySet - 就如同使用farms[0] - 永遠訪問數據庫,得到一個新的實例。也就是說,通過farms[0]所指的對象是不一樣的一個你當你後來通過查詢集再次重複。

答案是對查詢集轉換到一個列表直線距離:那麼您可以在實例屬性集,以及隨後的訪問將指向同一個實例。

farms = list(farm_model.objects.all()) 
farms[0].map_top = 80 
+0

工作正常!任何想法如何設置它由PK? '農場[pk] .map_top = 80' – luzik

+0

您可以通過循環創建一個字典映射pk到object:'mapping = {obj.pk:obj for obj in farms}',然後在'mapping [pk] '(注意這與列表中的對象相同,所以你仍然可以通過列表而不是模板的字典)。 –

2

這聽起來像是您試圖擴展您的模型以包含模板的更多信息。您可以創建一個數據對象來表示這一點。創建封裝實際模型的數據類是一種常見模式。你甚至可以在你的數據類的方法,你可以在模板中調用做多複雜的操作。

這可能是一些像

class FarmData(object): 
    def __init__(self, farm, map_top, map_left): 
     self.name = farm.name 
     self.map_top = map_top 
     self.map_left = map_left 

    def some_fn(self): 
     return some_output 

,並在您views.py,你可以這樣做

farms = farm_model.objects.all() 
farm_data_list = [] 
for farm in farms: 
    farm_data = FarmData(farm, map_top, map_left) # I don't know how you are defining map data 
    farm_data_list.append(farm_data) 

context = { 'farms': farm_data_list } 

而在你的模板,每個farm_datafarm_data_list會在定義的附加屬性你的數據類。一個你可以在模板中使用{{ farm_data.some_fn }}能夠調用您的數據類的方法。

雖然你可以去用用字典的自定義標籤的路線,我更喜歡使用一個數據類,因爲它是一個有點容易遵循的道路,當你重新審視你的代碼。

+0

你的方式更像是它應該以正確的方式完成..但@Daniel與'list(farm_model.objects.all())技巧'是簡單的。任何方式thx! – luzik