如何在模型中显示模板数据?

时间:2015-06-20 22:00:05

标签: django

您好我有两个模特:

class Country(models.Model):
    name = models.CharField(max_length=50)

class City(models.Model):
    name = models.CharField(max_length=50)
    country = models.ManyToManyField(Country)

现在我想在每个城市的模板名称和国家/地区显示,但是当我这样做时:

{% for city in cities %}
    {{ city.name }}
    {{ city.country | linebreaks }}
{% endfor %}

我明白了:

London 
city.Country.None 

Berlin 
city.Country.None 

Paris 
city.Country.None

我必须改变什么?

的观点:

def city_list(request):
    cities = City.objects.all().order_by('name')
    return render(request, 'city/city_list.html', {'cities': cities})

编辑: 我在city.country上的模板city.country.name中进行了更改,但我只得到了这个:

London 
None 

Berlin 
None 

Paris 
None

我不知道国名如何改变“无”。

第二个问题:我希望显示属于国家的每个城市。

def England(request):
    cities = City.objects.filter(country__name__exact="England").order_by('-name')
    return render(request, 'city/city_list.html', {'cities': cities})

它有效,但我希望它会自动显示给每个国家/地区,我不想为一个国家/地区创建一个视图。

我创建的视图指向国家/地区详细信息,但是如何显示位于此国家/地区的城市?

def country_detail(request, pk):
    country = get_object_or_404(Country, pk=pk)
    return render(request, 'city/country_detail.html', {'country': country})

1 个答案:

答案 0 :(得分:4)

您的城市模型与国家/地区模型具有ManyToMany关系。所以在你的模板中,city.country引用了django内置的管理器中的相关数据。你需要循环它:

{% for city in cities %}
    {% for country in city.country.all %}
        {{ city.name }}
        {{ country.name | linebreaks }}
    {% endfor %}
{% endfor %}

实际上我认为你应该有一个ForeignKey关系而不是ManyToMany,因为你的Country模型有很多城市,但是City只有一个Country。所以你的最终代码应该如下:

class Country(models.Model):
    name = models.CharField(max_length=50)

class City(models.Model):
    name = models.CharField(max_length=50)
    country = models.ForeignKey(Country)

和您的初始模板代码:

{% for city in cities %}
     {{ city.name }}
     {{ city.country | linebreaks }}
{% endfor %}

编辑:

如果要显示属于一个国家/地区的所有城市django提供相关经理,那么您可以使用:

country.city_set.all()

或者您可以在模型中使用related_name为ForeignKey,例如:

class City(models.Model):
    name = models.CharField(max_length=50)
    country = models.ForeignKey(Country, related_name="cities")

所以你现在可以使用:

country.cities.all()