如何在django视图中定义get_queryset,get_context_data?

时间:2014-08-13 02:27:17

标签: python django django-models django-templates django-views

我希望在子项目中为每个作者显示一个AuthorsBooks的树, 比如show in the image和...我在OneToMany关系中有两个模型AuthorBook

#models.py
from django.db import models

class Author(models.Model):
    Name = models.CharField(max_length = 250)

    def __unicode__(self):
        return self.Name

class Book(models.Model):
    Title = models.CharField(max_length = 250)

    def __unicode__(self):
        return self.Title


#views.py
from django.shortcuts import render, get_object_or_404
from django.views.generic import TemplateView, ListView

from .models import InstanciaJudicial, SedeJudicial

class Prueba(ListView):
    model = SedeJudicial
    template_name = 'instancias/pruebas.html'

我知道我定义了get_querysetget_context_data,但我不知道我是如何做到的。

1 个答案:

答案 0 :(得分:12)

首先,您需要在模型之间建立ForeignKey关系。

#models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length = 250)
    author = models.ForeignKey(Author, related_name="books")

    def __unicode__(self):
        return self.Title

现在,在您的视图中,您应该可以通过覆盖get_queryset方法来检索您的作者列表:

#views.py
from django.shortcuts import render, get_object_or_404
from django.views.generic import TemplateView, ListView

from .models import Author

class BooksByAuthorList(ListView):
    model = Book
    template_name = 'instancias/pruebas.html'

    def get_queryset(self):
        return Author.objects.prefetch_related("books").all()

只需使用上面的视图,您就可以拥有模板:

<ul>
{% for author in object_list %}
  <li>{{author.name}}</li><ul>
  {% for book in author.books.all %}
    <li>book.title</li>
  {% endfor %}
  </ul>
{% endfor %}
</ul>

现在说你要自定义它,以便代替通用的object_list上下文变量而不是像authors这样在域中合理的东西。

只需增加您的观点:

class BooksByAuthorList(ListView):
    model = Author
    template_name = 'instancias/pruebas.html'
    context_object_name = 'authors'        

    def get_queryset(self):
        return Author.objects.prefetch_related("books").all()

请注意,您根本不需要get_context_data

假设您想要添加一些其他数据,您只想覆盖get_context_data,在这种情况下,您希望保留已经存在的对象列表在您的上下文中首先调用超类get_context_data方法。

只是做:

    def get_context_data(self, *args, **kwargs):
        # Call the base implementation first to get a context
        context = super(BooksByAuthorList, self).get_context_data(*args, **kwargs)
        # add whatever to your context:
        context['whatever'] = "MORE STUFF"
        return context

get_context_data参数由您的路线决定。 *args**kwargs可能应该替换为您的视图和路线中特定的内容。