我有一个Django网站,我想在其中显示两个图表(Charta和 Chartb)获取股票清单,但我很难定义我的模型。对 现在,我的models.py中有多个相关的表:
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。
谢谢!
答案 0 :(得分:3)
Charta
和Chartb
的{{1}}字段为ForeingKey
,因此当您Stock
为one-to-many
时,您正在处理Stock
关系侧。
在您的代码中,您有:
{% for x_val in stock.charta.x_value %}
<li>x_val</li>
{% endfor %}
但那是错的。如果要从Charta
对象访问Stock
对象,则必须编写:
{% for charta in stock.charta_set.all %}
<li> {{ charta.x_axis }} </li>
{% endfor %}
请注意 charta_set 更改。这是因为Django默认生成,object manager
称为charta_set
或chartb_set
。{/ p>
您可以修改模型,以便为charta
中的charb
和stock
个对象指定“关系名称”。
class Charta(Model):
...
stock = models.ForeignKey(Stock, related_name='charta')
...
将模板代码更改为:
{% for charta in stock.charta.all %}
<li>{{ charta.x_axis }}</li>
{% endfor %}
答案 1 :(得分: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})
以上允许在import pdb语句中暂停程序,并允许您检查库存对象。
默认情况下,在django中,reverse foreignkey在<<model>>_set
属性中导航
stock.charta_set
将返回经理而不是实际的图表实例。要做到这一点应该是
stock.charta_set.all()
或在您的模板中:
stock.charta_set.all