get_queryset () отсутствует 1 обязательный позиционный аргумент: 'country_id' - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть список стран, к которым у них есть URL, например, www.example.com/al/.Но когда я хочу отфильтровать представление по country_id, это дает мне такую ​​ошибку:

get_queryset () отсутствует 1 обязательный позиционный аргумент: 'country_id'

Мои модели

class Country(models.Model):
    COUNTRY_CHOICES = (
        ('Albania', 'Albania'),
        ('Andorra', 'Andorra'),
        # etc. etc.
)
name = models.CharField(max_length=255, choices=COUNTRY_CHOICES, default='Netherlands')

    def __str__(self):
       return self.name

class City(models.Model):
     country = models.ForeignKey(Country, on_delete=models.CASCADE)
     name = models.CharField(max_length=250)

     def __str__(self):
        return self.name

Мои Взгляды

class CityOverview(generic.ListView):
template_name = 'mytemplate.html'

def get_queryset(self, country_id, *args, **kwargs):
    return City.objects.get(pk=country_id)

Мои URL

# Albania
path('al', views.CityOverview.as_view(), name='al'),

# Andorra
path('ad', views.CityOverview.as_view(), name='ad'),

# etc. etc.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Просто получите country_id от kwargs.Для get_queryset вам нужно вернуть queryset, но не один объект.Поэтому используйте filter вместо get.

def get_queryset(self, *args, **kwargs):
    country_id = self.kwargs['country_id']
    return City.objects.filter(country=country_id)
0 голосов
/ 21 февраля 2019

Вам нужно поменять в нескольких местах, давайте начнем с моделей:

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, а не объект .

0 голосов
/ 21 февраля 2019

Это происходит потому, что ваш urls.py не передает views.py позиционный аргумент country_id.Вы можете исправить это так:

path('<str:country_id>', views.CityOverview.as_view())

Теперь этот путь будет работать, если пользователь перейдет к / al и / ad, и строка будет передана в ваше представление CityOverview в качестве позиционного аргумента.См. Django Docs в диспетчере URL для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...