Here is my models.py:
SHOW = (
    (0,"Ballers"),
    (1,"Silicon-Valley")
)
class Show(models.Model):
    show = models.IntegerField(choices=SHOW, blank=True, null=True)
Here is from my urls.py:
urlpatterns = [
    path('<str:show>/', views.ShowList.as_view(), name='show-list'),
]
Here is the function from views.py:
class ShowList(generic.ListView):
    def get_queryset(self):
        return Show.objects.filter(show=self.kwargs['show'])
I want to be able to have the url look like this: https://www.mywebsite.com/ballers, but when I try to run it, I get this error: Field ‘show’ expected a number but got ‘ballers’. I know I can fix this by calling the url https://www.mywebsite.com/0, but I don’t want the url to look like that.
Advertisement
Answer
In Django it takes first argument as the value to pass into db (field), so basically with:
return Show.objects.filter(show=self.kwargs['show'])
it tries to look directly with passing value. DB-wise it knows ONLY integers for that matter. So instead of looking directly, try to make small change:
class ShowList(generic.ListView):
    def get_queryset(self):
        show_string = self.kwargs['show']
        show_int = [show[0] for show in Show.SHOW if show[1].lower() == show_string.lower()][0]
        return Show.objects.filter(show=show_int)
and also move choices inside the model:
class Show(models.Model):
    SHOW = (
        (0,"Ballers"),
        (1,"Silicon-Valley")
    )
    show = models.IntegerField(choices=SHOW, blank=True, null=True)