Вам нужно поменять в нескольких местах, давайте начнем с моделей:
class Country(models.Model):
COUNTRY_CHOICES = (
('al', 'Albania'), # changing the first value of the touple to country code, which will be stored in DB
('an', 'Andorra'),
# etc. etc.
)
name = models.CharField(max_length=255, choices=COUNTRY_CHOICES, default='nl')
def __str__(self):
return self.name
Теперь нам нужно обновить путь URL, чтобы получить значение кода страны:
path('<str:country_id>/', views.CityOverview.as_view(), name='city'),
Здесь мы используем str:country_id
, как переменную динамического пути, которая будет принимать строку в пути, которая будет передана представлению как country_id.Это означает, что когда бы вы ни использовали, например, localhost:8000/al/
, оно передаст в представление значение al
в качестве кода страны.
Наконец, получим значение country_id
в ListView и используем его вQuerySet.Вы можете сделать это следующим образом:
class CityOverview(generic.ListView):
template_name = 'mytemplate.html'
def get_queryset(self, *args, **kwargs):
country_id = self.kwargs.get('country_id')
return City.objects.filter(country__name=country_id)
Вам необходимо обязательно вернуть queryset из метода get_queryset
, а не объект .