Django DetailView Filter by Foreign Key

2019-07-19 15:14发布

问题:

I am little puzzled and would like to utilized the DetailView functionality using the foreign key as my filter to display the data. Basically my model looks like this:

class Category(models.Model):
    name = models.CharField(max_length=30)
    slug = models.SlugField(help_text="A short name for Category")

    def __unicode__(self):
       return self.name

    class Meta:
       ordering = ["-name"]
       verbose_name_plural = "categories"  


class Publisher(models.Model):
    name = models.CharField(max_length=30)
    slug = models.SlugField(help_text="A short name for Publisher")

    class Meta:
       ordering = ["-name"]

    def __unicode__(self):
        return self.name


class Book(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(help_text="A short name for book")
    pub_date = models.DateField()
    publisher = models.ForeignKey(Publisher)
    category = models.ForeignKey(Category)

    class Meta:
       ordering = ["-title"]

    def __unicode__(self):
       return self.title

My Urls.py:

url(r'^categories/(?P<slug>[\w-]+)/$', DetailView.as_view(model=Category,template_name="books/category_detail" )),

My Category_detail.html

{% block content %}
    <h2>{{ category.name}} </h2>
    <ul>       
    <li>Book Title: {{ book.title }}</li>
<li>Book publisher: {{ book.publisher }}</li>
    <li>Book Published Date: {{ book.pub_date }}</li>    
    </ul>
{% endblock %}

Basically I would like to display in my category_detail.html the following information:

  • Category Name
  • Book Title
  • Publisher Name
  • Published Date
  • Any help would be appreciated.

    Thank you - Keoko

    回答1:

    Thank you for your kind response. I created a views.py file with the following information:

    from django.shortcuts import get_object_or_404
    from django.views.generic import ListView
    from mysite.books.models import *
    
    class BooksCategoryListView(ListView):
    
       context_object_name = "book_list"
    
       "get_queryset = query all the objects in the database"
        def get_queryset(self):
          category_slug = get_object_or_404(Category, slug=self.kwargs['slug'])
          return Book.objects.filter(category=category_slug)
    

    And updated my application urls.py:

    from django.conf.urls import patterns, url, include
    from django.views.generic import ListView, DetailView
    from mysite.books.views import BooksCategoryListView
    from mysite.books.models import *
    
    urlpatterns = patterns('',
       ...snip....        
       url(r'^categories/(?P<slug>[\w-]+)/$', BooksCategoryListView.as_view()),  
    )
    

    And finally modified the category_detail.html with the following:

    {% block content %}
    <h2>Book Details</h2>
    <ul>     
       <li>Category: {{ book.category}}</li> 
       <li>Title: {{ book.title }}</li>
       <li>Author: {{ book.authors }}</li>
       <li>Publisher: {{ book.publisher }}</li>
       <li>Published Date: {{ book.pub_date }}</li>            
    </ul>
    {% endblock %}
    


    回答2:

    In template you have category object. you can iterate all over the books;

    {% for book in category.book_set.all %}
       Book Title: {{ book.title }}
       Book publisher: {{ book.publisher }}
       Book Published Date: {{ book.pub_date }}
    {% endfor %}
    

    or just first book;

       Book Title: {{ category.book_set.all.0.title }}
       Book publisher: {{ category.book_set.all.0.publisher }}
       Book Published Date: {{ category.book_set.all.0.pub_date }}