Python 如何从数据库中获取一个国家的城市列表?
我有两种型号,城市和国家。我想在基于所选国家的页面上显示该国的城市。我试图查询国家模型,并将其传递给城市模型,以查找与国家相关的所有城市,但目前,页面显示所有城市,无论国家是什么 当用户从页面中选择国家时,如何显示一个国家的城市 非常感谢您的帮助或建议 型号.pyPython 如何从数据库中获取一个国家的城市列表?,python,django,django-models,django-views,django-templates,Python,Django,Django Models,Django Views,Django Templates,我有两种型号,城市和国家。我想在基于所选国家的页面上显示该国的城市。我试图查询国家模型,并将其传递给城市模型,以查找与国家相关的所有城市,但目前,页面显示所有城市,无论国家是什么 当用户从页面中选择国家时,如何显示一个国家的城市 非常感谢您的帮助或建议 型号.py class City(models.Model): country = models.ForeignKey('Country', on_delete=models.CASCADE, related_name='country'
class City(models.Model):
country = models.ForeignKey('Country', on_delete=models.CASCADE, related_name='country')
name = models.CharField(max_length=90, verbose_name='City name')
slug = models.SlugField(null=True, unique=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('city:cities', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
return super().save(*args, **kwargs)
class Country(models.Model):
country_name = models.CharField(max_length=50, verbose_name='Country name',unique=True)
slug = models.SlugField(null=True, unique=True)
def __str__(self):
return self.country_name
def get_absolute_url(self):
return reverse('city:cities', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.country_name)
return super().save(*args, **kwargs)
class CountriesListView(ListView):
template_name = "countries.html"
model = Country
context_object_name = "countries"
class CitiesListView(ListView):
template_name = "cities_list.html"
model = City
context_object_name = "cities"
def get_context_data(self, *args, **kwargs):
context = super(CitiesListView, self).get_context_data(*args,**kwargs)
countries = Country.objects.all()
cities = City.objects.filter(country__in=countries)
context['cities'] = cities
return context
视图.py
class City(models.Model):
country = models.ForeignKey('Country', on_delete=models.CASCADE, related_name='country')
name = models.CharField(max_length=90, verbose_name='City name')
slug = models.SlugField(null=True, unique=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('city:cities', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
return super().save(*args, **kwargs)
class Country(models.Model):
country_name = models.CharField(max_length=50, verbose_name='Country name',unique=True)
slug = models.SlugField(null=True, unique=True)
def __str__(self):
return self.country_name
def get_absolute_url(self):
return reverse('city:cities', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.country_name)
return super().save(*args, **kwargs)
class CountriesListView(ListView):
template_name = "countries.html"
model = Country
context_object_name = "countries"
class CitiesListView(ListView):
template_name = "cities_list.html"
model = City
context_object_name = "cities"
def get_context_data(self, *args, **kwargs):
context = super(CitiesListView, self).get_context_data(*args,**kwargs)
countries = Country.objects.all()
cities = City.objects.filter(country__in=countries)
context['cities'] = cities
return context
模板
# countries.html
<h1>Countries</h1>
{% for country in countries %}
<h3><a href="{% url 'city:cities' country.slug %}">{{ country.country_name }}</h3>
{% endfor %}
# cities_list.html
<h1>Cities</h1>
{% for city in cities %}
<div>
<h3><a href="{% url 'city:details' city.slug %}">{{ city }}</a></h3>
</div>
{% endfor %}
#countries.html
国家
{国家/地区百分比中的国家/地区百分比}
{%endfor%}
是反向关系的名称,以便访问特定国家的城市
对象。因此,给它命名为国家不是一个好主意。您可以将其重命名为城市,例如:
class City(models.Model):
country = models.ForeignKey(
'Country',
on_delete=models.CASCADE,
related_name='cities'
)
# …
因此,在URL中,您可以使用slug字段在名称cities
下注册此视图:
# app/urls.py
from django.urls import path
from . import views
app_name='city'
urlpatterns = [
# …,
path(
'country/<slug:slug>',
views.CountryDetailView.as_view(),
name='cities'
),
]
#app/url.py
从django.url导入路径
从…起导入视图
app_name='city'
URL模式=[
# …,
路径(
“国家/”,
views.CountryDetailView.as_view(),
城市名称
),
]
在模板中,您可以反向访问关系:
<!-- country_detail.html -->
{{ country }}
{% for city in country.cities.all %}
{{ city }}
{% endfor %}
{{国家}
{country.cities.all%中城市的百分比}
{{城市}
{%endfor%}
我建议你用Ajax来做这类事情谢谢你,弗洛林。你能告诉我如何使用Ajax吗?我在很多方面都尝试过,但它并没有显示只有一个国家有城市,或者表现不符合预期。我从{{country}回来,第二部分,for循环,什么也没有。如果我删除.cities.all,那么我将得到国家列表。我错过了什么?@EgonSaks:但是你使用了详细视图
,参数是slug
?是的,威廉。在URL中,我将其与slug一起使用,正如您所提到的/国家/爱沙尼亚,然后我看到的是来自{{country}的查询集,没有来自for循环的任何内容。如果我删除.cities.all,我可以得到一个国家列表,而不是爱沙尼亚的城市列表。@EgonSaks:是的,但我犯了一个错误,它应该是DetailView
的子类,而不是ListView
。然后模板应该与答案中的一样。现在它可以工作了!!非常感谢,威廉。我试着用3天的时间来解决这个问题,现在它真的很有效。非常感谢你的帮助!!!:)