如何在基于类的视图中进行多个模型查询(模板视图)

时间:2015-10-19 08:33:36

标签: python django html5

我正在开发一个Django项目,我有3个模型书籍,章节,主题。

我想显示用户界面中所有图书的列表。当用户点击任何书籍时,所有章节都会显示,当用户点击任何章节时,将显示所有主题。

我试图使用基于类的视图来获取它。 要获取图书清单,请查看view.py

class read_books(TemplateView):
model = books
template_name='books_list.html'    
def get_context_data(self, *args, **kwargs):
    ctx = super(read_books, self).get_context_data(*args, **kwargs)
    ctx["books"]=books.objects.all()
    #here is the problem
    ctx["chapters"]=chapters.objects.filter(book_id=4)
    return ctx

和books_list.html为          

<script>
    $(document).ready(function(){
        $("#child").hide();
        $("#parent").click(function(){
        $("#child").show();
        });
    });
</script>
</head>

 <div id="parent" class="nav-width center-block">
    {% for wb in books %}
        <button>{{ wb.book_name }}</button>
        </br></br>
    {% endfor %}
</div>


<div id="child">
    {% for s in chapters %}
    <a href="">{{s.sheet_name}}</a>
    </br></br>
    {% endfor %}
</div>
{% endblock %}

现在我很麻烦,会有一份有id的书籍清单。我想通过那个id     &#39; CTX [&#34;章节&#34] = chapters.objects.filter(book_id = 4)&#39; 现在我手动传递它。任何人都可以建议并帮助如何从书籍模型获取id并在此查询中传递它 任何帮助都会受到高度关注。

2 个答案:

答案 0 :(得分:1)

如果你想坚持使用CBV,你应该有类似下面的内容

class BookList(ListView):
   model = Book

# the below would show the details of particular chapters for a specific book

class BookDetail(DetailView):
   model = Book

#and so on
class chapterList(ListView):
   model = Chapter

on your html - link the urls to each book/chapter by using their respective pks

<a href = '{% url "book" pk = obj.pk %}'></a>

答案 1 :(得分:0)

好吧,假设您希望将视图实现为TemplateView(但返回相同的结果+在不同模型上的其他一些查询。您可以执行以下操作:

# models.py
class Book(models.Model):
    ...

class Model1(models.Model): 
    ...

class ModelN(models.Model):
    ...

# views.py
class BookTemplateView(TemplateView):

    def get_context_data(self, *args, **kwargs):
        ctx = super(BookTemplateView, self).get_context_data(*args, **kwargs)
        ctx["books"] = Book.objects.all()
        ctx["data_1"] = Model1.objects.all() # you can refine this, of course
        ...
        ctx["data_n"] = ModelN.objects.all() # you can refine this, of course

        return ctx

并且在Book_list.html中,您可以写一些类似的内容(取自您的问题):

{% for wb in books %}
  <button>{{ wb.book_name }}</button>
  </br></br>
{% endfor %}

...
{% for object in data_1 %}
    ... do something meaningful ...
{% endfor %}
...
{% for object in data_n %}
    ... do something meaningful ...
{% endfor %}

请注意,如果BookTemplateView继承自ListView,则此功能将完全相同,然后您无需分配ctx["books"] = Book.objects.all()(这就是为什么我认为这样做的原因少干的方法)

这接近你喜欢做的事吗?