2017-10-31 8 views
0

두 개의 템플릿에서 개체를 필터링하려고합니다. 한 (부모)는 가장 최근에 업데이트 된 5 개를 표시하고 다른 하나는 모두 표시해야합니다.django - 여러 템플릿에서 개체를 필터링하고 있습니까?

views.py :

... 
class ChannelProjectList(generic.ListView): 
    context_object_name = 'projects_by_channel' 
    template_name = 'channels/projects_by_channel.html' 

    def get_queryset(self): 
     self.channel = get_object_or_404(Channel, slug=self.kwargs['slug']) 
     return Project.objects.filter(channel=self.channel) 
... 

HTML : 나는에 갈 때

{% for project in projects_by_channel %} 
{{project.name}} 
{% endfor %} 

는 그러나 "를 포함

나는 후자는 다음 코드를 사용하여 완벽하게 작동해야 부모 페이지에서 깨집니다. 약간의 연구가 끝나면 왜 그런 일이 일어나는지, 그리고 왜 그런 일을하는 것이 적절한 지 이해할 수 없습니다. 나는 주위를 파고 this을 찾았는데 정확히 무엇을하려고하는지 알 것 같지만 구현했을 때 작동하지 않았을뿐만 아니라 작동중인 페이지를 부러 뜨렸다.

이것은 아주 간단한 것처럼 느껴지지만이 프로젝트가 처음으로 새로운 프로젝트를 시작한 이래로 나는 매일 새로운 프로젝트에 뛰어 들고 있습니다.

최종 해결책 : this의 도움으로

나는 내가 "view.channel_projects"를 사용하여 템플릿에 전화를 한 후 수 있었다 두 번째 템플릿보기에 같은 get_queryset에 복사 할 필요 실현

답변

0

두 가지 가능성이 있습니다. 먼저 두 개의 컨텍스트 변수를 정의 할 수 있습니다 (예 : 연결된 솔루션에서 완료 됨). qs을 템플릿에 포함 할 수 있습니다.

1. 옵션 조각 :

이 하나가 표시하는 모든 :

{% for project in projects_by_channel|slice:":5" %} 
{{project.name}} 
{% endfor %} 

2. 옵션 정의하는 두 개의 쿼리 세트 : 만 표시 5 개 항목에 대한

{% for project in projects_by_channel %} 
{{project.name}} 
{% endfor %} 

이 : (보기 용)

def get_queryset(self): 
    self.channel = get_object_or_404(Channel, slug=self.kwargs['slug']) 
    self.channel2 = get_object_or_404(Channel, id=12)#whatever 
    context["list"] = Project.objects.filter(channel=self.channel) 
    context["list2"] = Project.objects.filter(channel=self.channel2)[0:5] #this slices the query set for the first entries. If you want to order them first(by date or whatever) use "order_by()" 
    return context 

(HTML)

{% for project in list %} 
{{project.name}} 
{% endfor %} 


{% for project in list2 %} 
{{project.name}} 
{% endfor %} 

단일 QS하지만 한 번에 전체를 표시하려면 다른 템플릿그냥 처음 5 당신은 템플릿에 slice 인수를 사용하여 더 나은 적합 . 보기를 깨끗하고 단순하게 유지하며 두 번 쿼리하지 않아도됩니다. 의견을 남기지 않으면 도움이되기를 바랍니다.

+0

슬라이스가 훨씬 깨끗해 보입니다. 문제는 내가 채널 템플릿을 사용하고있을 때 projects_by_channel에있는 "projects"를 찾지 못하고 {% empty %} 부분 만 표시하고있는 것 같습니다. 그게 합리적이라면 generic.ListView의 template_name 부분 만이 그 템플릿에서 작동하도록 허용하고있는 것처럼 느껴 집니까? –

+0

다른보기의 경우 다른보기 기능을 정의해야합니다. 따라서 다른 템플릿에서 뷰를 작성해야하며 이러한 뷰에서 각 템플릿의 컨텍스트 변수를 정의해야합니다.두 번째 템플릿은 어딘가에서보기가 있어야합니다. "include"를 사용하면 동일한 변수가 적용됩니다. – hansTheFranz

+1

고맙습니다. –