2

我有点困惑,想利用 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

    4

    2 回答 2

    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 %}
    
    于 2012-12-31T19:57:20.887 回答
    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 }}
    
    于 2012-12-31T13:09:48.553 回答