Search code examples
pythondjangoweb-deployment

Django - Can't access data from object in many to many relationship


In my Django project, I am trying to create a website that streams TV shows. Each show belongs in many categories, hence the use of many to many relations in my model. What I want to do with a certain page on my website is dynamically load a page of shows belonging to a specific category. However, all of my attempts have ended in failure as I am unable to figure out a way on how to access the actual category data from each show.

In views.py

def shows_in_category(request, category_slug):
   category = get_object_or_404(Category, slug=category_slug)
   showsall = theShow.objects.all()
   shows = []
   for show in showsall:
       print(show.category.name, category.name)
       if show.category.name == category.name:
        shows.append(show)
   print(shows)
   return render(request, 'show/show_list_view.html', {'category':category, 'shows': shows})

In models.py

class Category(models.Model):
   name = models.CharField(max_length=255, db_index=True)
   slug = models.SlugField(max_length=255, unique=True)


class Meta:
    verbose_name_plural = 'Categories'
    
def __str__(self):
    return self.name

def get_absolute_url(self):
    return reverse("theshowapp:shows_in_category", args=[self.slug])

class theShow(models.Model):
english_name = models.CharField(max_length=400)

show_type = models.CharField(max_length=200, blank=True)
is_active = models.BooleanField(default=False)
category = models.ManyToManyField(Category)

slug = models.SlugField(max_length=400,unique=True)

class Meta:
    verbose_name_plural = 'Shows Series'

def __str__(self):
    return self.english_name

In the template (show_list_view.html)

{% for show in shows %}
                    <script> console.log("I'm trying to get in")</script>
                    <script> console.log("{{ show.name }} {{show.category.name}}")</script>
                    <script> console.log("I'm in")</script>
                    <div class="row">
                        <div class="col-lg-4 col-md-6 col-sm-6">
                            <div class="product__item">
                                
                                <div class="product__item__text">
                                    <ul>
                                    {% for genre in show.category %}
                                        <li>{{ show.category }}</li>
                                    {% endfor %}
                                    </ul>
                                    <h5><a href="#">{{ show.english_name }}</a></h5>
                                </div>
                            </div>
                        </div>
                    </div>
 {% endfor %}

Any insight on this matter would be much appreciated.


Solution

  • I read up a bit more on the many to many fields examples in Django's documentation and figured out that I should use this: shows = animeShow.objects.all().filter(category__name=category)