2014-02-20 105 views
0

我有一個Django網站,我想顯示兩個圖表(Charta和 Chartb)以獲取股票列表,但我正在努力定義我的模型。右 現在,我在我的models.py多個相關表:繼Django ForeignKey關係向後

from django.db import models 

class Stock(models.Model): 
    name = models.CharField(max_length=100) 
    company = models.CharField(max_length=100) 

    def __unicode__(self): 
     return self.name 

class Charta(models.Model): 
    stock = models.ForeignKey(Stock) 
    x_axis = models.IntegerField(default=0) 
    y_axis = models.IntegerField(default=0) 

class Chartb(models.Model): 
    stock = models.ForeignKey(Stock) 
    x_axis = models.IntegerField(default=0) 
    y_axis = models.IntegerField(default=0) 

我的目標是有一個股票網頁,其中列出了我的股票表中的所有股票,然後 詳細信息頁面的每一個股票,我可以顯示每個圖表的 的x和y座標。 (一旦我有這些座標,我可以繪製它們,但現在我只是在屏幕上打印座標而苦苦掙扎)。到目前爲止,我的views.py 文件看起來像這樣:

from django.shortcuts import render, get_object_or_404 
from stocks.models import Stock, Charta, Chartb 

def index(request): 
    stock_list = Stock.objects.all() 
    context = {'stock_list': stock_list} 
    return render(request, 'stocks/index.html', context) 

def detail(request, stock_id): 
    stock = get_object_or_404(Stock, pk=stock_id) 
    return render(request, 'stocks/detail.html', {'stock': stock}) 

做事就這樣,我能夠很容易地得到呈現在我的表中的所有股票 ,連接每一個到詳細信息頁面股頁面,使用下面的index.html文件 :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
    <head> 
    </head> 
    <body> 
    <h1>Stocks</h1> 

    {% if stock_list %} 
     <ul> 
     {% for stock in stock_list %} 
      <li><a href="/stocks/{{ stock.id }}/">{{ stock.name }}</a></li> 
     {% endfor %} 
     </ul> 
    {% else %} 
     <p>No stocks are available.</p> 
    {% endif %} 

    </body> 
</html> 

我在其中顯示了每隻股票的座標在細節 頁面的問題。我想有一個details.html頁面如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
    <head> 
    </head> 
    <body> 
    <h1>Stock Details</h1> 

    <!-- This works fine --> 
    <p>The name of this stock is <strong>{{ stock.name }}</strong> </p> <br> 
    <p>This stock comes from <strong>{{ stock.company }}</strong> </p> <br> 

    <!-- This doesn't work --> 
    <p>The x values for this stock are: </p> 
     <ul> 
     {% for x_val in stock.charta.x_axis %} 
      <li>x_val</li> 
     {% endfor %} 
     </ul> 
    <p>The y values for this stock are: </p> 
     <ul> 
     {% for y_val in stock.charta.y_axis %} 
      <li>y_val</li> 
     {% endfor %} 
     </ul> 

    </body> 
</html> 

但是,我不能打電話給x_values和y_values喜歡的東西 stock.charta.x_axis。有沒有更好的方法可以設置我的模型,以便我可以訪問細節頁面中每個股票的圖表數據? 直觀地說,我有一個表格列出股票,然後使用某種SQL連接訪問每個圖表的數據。

我已經把這個項目的一個最小的例子在github here

謝謝!

+1

你意味着'x_value'是'x_axis'? 'y_value'分別。 – gwaramadze

+0

@pythonishvili:啊,是的。謝謝 - 這是一個錯字。我已經編輯了這個問題 - 儘管如此,代碼仍然不適用於這些更改。 – Steve

回答

3

ChartaChartbStock一個ForeingKey場,所以你正在處理一個one-to-many關係,當Stock是一邊。

在你的代碼有:

{% for x_val in stock.charta.x_value %} 
    <li>x_val</li> 
{% endfor %} 

但這是錯誤的。如果你想從一個Stock對象訪問Charta對象,你必須寫:

{% for charta in stock.charta_set.all %} 
    <li> {{ charta.x_axis }} </li> 
{% endfor %} 

注意charta_set變化。這是Django默認生成的,object manager稱爲charta_setchartb_set

您可以修改模型,以便爲stock中的chartacharb對象指定「關係名稱」。

class Charta(Model): 
    ... 
    stock = models.ForeignKey(Stock, related_name='charta') 
    ... 

並更改模板代碼:

{% for charta in stock.charta.all %} 
    <li>{{ charta.x_axis }}</li> 
{% endfor %} 
+0

編輯!我只是修正了一些錯誤。 –

+0

謝謝 - 這正是我一直在尋找的!我記得在教程中閱讀了關於屬性的<,但我想我從來沒有完全理解它。 – Steve

1

由於錯誤被壓制,因此很難在模板中進行調試!這是很容易在你看來

def detail(request, stock_id): 
    stock = get_object_or_404(Stock, pk=stock_id) 
    import pdb; pdb.set_trace(); 
    return render(request, 'stocks/detail.html', {'stock': stock}) 

調試以上允許將在進口PDB聲明暫停你的程序,並允許你檢查你的股票對象。

默認情況下在Django,reverse外鍵通過<<model>>_set財產

stock.charta_set這將返回經理而不是實際的圖表實例導航。要做到這一點應該是

stock.charta_set.all()

或在您的模板:

stock.charta_set.all

+0

謝謝!這是有幫助的 – Steve