Django DetailView按外键过滤

时间:2012-12-30 16:44:39

标签: django foreign-keys detailview

我很困惑,并希望使用外键作为我的过滤器来显示数据的DetailView功能。基本上我的模型看起来像这样:

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

我的Urls.py:

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

我的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 %}

基本上我想在category_detail.html中显示以下信息:          

  • 类别名称
  •          
  • 书名
  •          
  • 发布商名称
  •          
  • 发布日期
  • 任何帮助都将不胜感激。

    谢谢 - Keoko

    2 个答案:

    答案 0 :(得分:2)

    感谢您的回复。我创建了一个views.py文件,其中包含以下信息:

    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)
    

    并更新了我的应用程序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()),  
    )
    

    最后使用以下内容修改了category_detail.html:

    {% 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 %}
    

    答案 1 :(得分:1)

    在模板中,您有类别对象。你可以遍历书籍;

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

    或者只是第一本书;

       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 }}