1

모두를위한 좋은 날!클래스 기반 제네릭 목록보기에서 장고 필터링 자식 개체

내 응용 프로그램은 django 클래스 기반의 일반 목록보기를 사용했습니다. 두 개의 모델 객체가 있습니다 : 외래 키 (아래 코드)를 통해 연결된 책 및 발행인. ListView를 사용하여 발행인에게 도서를 보여주고 싶지만 도서 필터링 (현재 사용자가 소유 한 활성 도서 만 가져옴)

추가 정보 : 가능하면 템플릿에 필터를 사용하고 싶지 않습니다. 추가 정보 2 : 내가 요청 개체에 대한 액세스를 필요로하기 때문에 모델 클래스에 정의를 통해 나는 필터를 사용할 수 없습니다

코드

models.py

class Publisher(models.Model): 
    name = models.CharField(max_length=255) 

class Book(models.Model): 
    name = models.CharField(max_length=255) 
    active = models.BooleanField(default=True) 
    publisher = models.ForeignKey(Publisher, related_name='books') 
    owner = models.ForeignKey(User) 

views.py

class ListBooksByPublisher(ListView): 
    model = Publisher 
    template_name = 'list.html' 
    context_object_name = 'books' 

list.html

{% for publisher in publishers %} 
    {{ publisher.name }} 
    {% for book in publisher.books.all %} 
     {{ book.name }} 
    {% endfor %} 
{% endfor %} 

많은 도움을 주셨습니다. ,

class ListBooksByPublisher(ListView): 
    .... 
    def get_queryset(self): 
     return self.model.objects.filter(blablabla)) 

희망이

답변

7

당신은 예를 들어

사용자 정의의 검색어 돌아보기에 get_queryset 방법을 덮어 쓸 필요 게시자에 대한 도서 목록을 반환합니다.

yourapp/templatetags/my_filters.py :

from django import template 
register = template.Library() 

@register.filter 
def get_books(publisher): 
    return publisher.book_set.filter(YOUR_CUSTOM_FILTER) 

귀하의 템플릿 :

{% load get_books from my_filters %} 
... 
{% for publisher in publishers %} 
    {{ publisher.name }} 
    {% for book in publisher|get_books %} 
     {{ book.name }} 
    {% endfor %} 
{% endfor %} 

또 다른 방법은보기에 추가 데이터를 전달하는 것입니다 : 나는에 get_queryset를 사용

class ListBooksByPublisher(ListView): 
    ... 
    def get_context_data(self, **kwargs): 
     context = super(ListBooksByPublisher, self).get_context_data(**kwargs) 
     context['publishers_with_books'] = your_custom_data_structure 
     return context 
+0

게시자 (상위 개체)를 필터링합니다. 하지만 자식 개체를 필터링하는 데 사용하는 방법을 이해할 수 없습니다. – logan

+0

그건 다른 질문 :) 그래서 자식 질문을 필터링하는 방법에 대한 또 다른 질문을 만듭니다 – pleasedontbelong

+0

그게 내가 물어 정확한 질문입니다. 장고 필터링 * 자식 * 객체 – logan

-2
#views 
class ListBooksByPublisher(ListView): 
    model = Publisher 
    template_name = 'list.html' 
    context_object_name = 'publishers' 
#tmp 
{% for publisher in publishers %} 
    {{ publisher.name }} 
    {% for book in publisher.book_set.all %} 
     {{ book.name }} 
    {% endfor %} 
{% endfor %} 
+0

여기 필터를 찾을 수 없습니다. 죄송합니다. – logan

0

당신은 사용자 정의 필터를 작성할 수 있습니다 :

+0

한가지 명심하십시오. CBV에 대한 요구 사항이 너무 복잡한 경우 함수 기반보기를 사용하는 데는 아무런 문제가 없습니다. –