2012-12-30 68 views
2

我有点困惑,并希望利用DetailView功能使用外键作为我的过滤器来显示数据。基本上我的模式是这样的:Django 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

    回答

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