我刚开始使用Django,并试图找出工作原理。我遇到了以下问题。
我有一个models.py:
class Station(models.Model):
code = models.CharField(max_length=10, default='')
land = models.CharField(max_length=10, default='')
def __str__(self):
return self.code
class Naam(models.Model):
kort = models.CharField(max_length=255, default='')
middel = models.CharField(max_length=255, default='')
lang = models.CharField(max_length=255, default='')
station = models.ForeignKey(Station, default='', on_delete=models.CASCADE, related_name='namen')
def __str__(self):
return self.lang
我有一个view.py:
def index(request):
all_stations = Station.objects.all()
return render(request,'stations/index.html', {'all_stations' : all_stations})
def detail(request, station_id):
try:
station = Station.objects.get(id=station_id)
stationnamen = station.namen.values()
except Station.DoesNotExist:
raise Http404("station does not exist")
return render(request, 'stations/detail.html', {'stationnamen' : stationnamen.values()})
在模板html中,我试图显示有关电台(kort,middel,lang)名称的一些细节。是否可以在查询集中显示特定字段,如:
<h1>{{ stationnamen.kort }}</h1>
在shell中,我可以按如下方式执行此操作:
station1.namen.values('kort')
这如何在模板文件中工作?
谢谢!
答案 0 :(得分:0)
values
返回一个返回字典的QuerySet
https://docs.djangoproject.com/en/1.10/ref/models/querysets/#values
您需要循环此QuerySet以获取dict对象。这个dict对象将包含你所有的字段。
station1.namen.values('kort')
在这里,您只需过滤字段 kort 。您的查询集包含仅包含 kort 信息的字典。
values()方法采用可选的位置参数* fields,它们指定SELECT应限制的字段名称。如果指定字段,则每个字典将仅包含指定字段的字段键/值。如果未指定字段,则每个字典将包含数据库表中每个字段的键和值。
{% for namen_dict in stationnamen %}
# used namen_dict to display what you want. It's a dict.
{% endfor %}
与Daniel Roseman一样,您不需要values()
来访问有关Naam对象的信息。你为什么使用values()
?
最终解决方案基于您的需求(见评论)
<强> view.py 强>
def index(request):
all_stations = Station.objects.all()
return render(request,'stations/index.html', {'all_stations' : all_stations})
def detail(request, station_id):
try:
stationnamen = Station.objects.get(id=station_id).namen.all() # Don't need station object.
except Station.DoesNotExist:
raise Http404("station does not exist")
return render(request, 'stations/detail.html', {'stationnamen' : stationnamen})
<强>模板强>
{% for naam in stationnamen %}
<h1>{{ naam.koort }}</h1>
<h1>{{ naam.middel }}</h1>
<h1>{{ naam.lang }}</h1>
<h1>{{ naam.station }}</h1>
{% endfor %}
解决方案,如果您有一对一的关系,除了
def detail(request, station_id):
try:
naam = Naam.objects.get(station_id=station_id) # Only one Naam object.
except Station.DoesNotExist:
raise Http404("station does not exist")
return render(request, 'stations/detail.html', {'naam' : naam})
模板(不需要循环)
<h1>{{ naam.koort }}</h1>
<h1>{{ naam.middel }}</h1>
<h1>{{ naam.lang }}</h1>
<h1>{{ naam.station }}</h1>
希望有所帮助。
答案 1 :(得分:0)
您的问题在于您使用values
。这是您想要获取词典的罕见场合,但大多数时候您只想传递实际的模型实例。
station = Station.objects.get(id=station_id)
stationnamed = station.namen.all()
....
return render(request, 'stations/detail.html', {'stationnamen' : stationnamen})
要理解的另一件事是,每个工作站都有许多 Naam实例,因此您需要在模板中迭代它们。
{% for naam in stationnamen %}
{{ naam.koort }}
{% endfor %}