您好我有两个模特:
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})
答案 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()