Django, generic view dynamic filtering

Viewed 34

i'm starting out with Django and trying to render all Shows(screenings) that selected Movie had. Here's the code:

url

path('movie/<int:pk>/', MovieDetails.as_view(), name='movie'),

Models

class Movie(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=255, blank=True)

    def __str__(self):
        return f'{self.title}'

class Show(models.Model):
    show_date = models.DateField()
    start_time = models.TimeField()
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE, null=True, blank=True)
    city = models.ForeignKey(City, on_delete=models.CASCADE, null=True, blank=True)
    title = models.CharField(max_length=200, blank=True)

    def __str__(self):
        return f'{self.show_date}'

View

class MovieDetails(DetailView):
    model = Movie
    context_object_name = 'movie'

    def get_queryset(self):
        self.movie = get_object_or_404(Movie, id=self.kwargs['pk']) #find movie by id from url
        shows_played = Show.objects.filter(movie=self.movie)
        print(shows_played) #prints out some shows
        return shows_played

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['shows_played'] = Show.objects.filter(movie=self.movie)

        return context

The shows_played prints out some shows, so it seems like everything is fine but when the url: /movies/1 is called I get a 404, No show found matching the query rendered in browser and Not Found: /movie/1/ printed in console

What am i doing wrong? Thank you

1 Answers

I figured it out. My mistake was that i was using DetailView instead of ListView(which has get_queryset method) for "MovieDetails".

Related