Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从数据库中获取一个国家的城市列表?_Python_Django_Django Models_Django Views_Django Templates - Fatal编程技术网

Python 如何从数据库中获取一个国家的城市列表?

Python 如何从数据库中获取一个国家的城市列表?,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'

我有两种型号,城市和国家。我想在基于所选国家的页面上显示该国的城市。我试图查询国家模型,并将其传递给城市模型,以查找与国家相关的所有城市,但目前,页面显示所有城市,无论国家是什么

当用户从页面中选择国家时,如何显示一个国家的城市

非常感谢您的帮助或建议

型号.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
视图.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天的时间来解决这个问题,现在它真的很有效。非常感谢你的帮助!!!:)