Django Python - 从模板中的related_object中选择列

时间:2017-01-02 13:12:25

标签: python django django-templates django-views

我刚开始使用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')

这如何在模板文件中工作?

谢谢!

2 个答案:

答案 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 %}