我希望在子项目中为每个作者显示一个Authors
和Books
的树,
比如show in the image和...我在OneToMany关系中有两个模型Author
和Book
。
#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_queryset
和get_context_data
,但我不知道我是如何做到的。
答案 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
可能应该替换为您的视图和路线中特定的内容。