2014-09-17 6 views
0

나는 다음과 같다 모델이에 의해 하위 그룹으로 나눈다 질의 : 내 의견이 같은 사용자가 항목을 필터링하고있어에서장고 - 속성

class ListEntry(models.Model): 
    STATUS_CHOICES = (
     ('PL', _('Playing')), 
     ('CO', _('Completed')), 
     ('OH', _('On-hold')), 
     ('DR', _('Dropped')), 
     ('WA', _('Want to play')), 
    ) 
    user = models.ForeignKey(User) 
    game = models.ForeignKey(Game) 
    status = models.CharField(_('Status'), max_length=2, 
           choices=STATUS_CHOICES) 

:

class GameListByUserView(ListView): 
    model = ListEntry 
    template_name = 'game_list_by_user.html' 

    def get_queryset(self): 
     self.user_profile = get_object_or_404(User, username=self.kwargs['slug']) 
     return ListEntry.objects.filter(user=self.user_profile) 

    def get_context_data(self, **kwargs): 
     context = super(GameListByUserView, self).get_context_data(**kwargs) 
     context['user_profile'] = self.user_profile 
     return context 

를 내가 지금하려고하면 status 속성에 따라이 쿼리 (ListEntry.objects.filter(user=self.user_profile))를 하위 그룹으로 분할하므로 렌더링 된 템플릿은 다음과 같이 표시됩니다.

UserFoo's list 
========================= 

Playing 

Game 1 
Game 2 
Game 3 


Completed 

Game 4 
Game 5 
Game 6 
그래서

q = ListEntry.objects.filter(user=self.user_profile) 
games_dict = {} 
games_dict['playing'] = q.filter(status='PL') 
games_dict['completed'] = q.filter(status='CO') 

그리고, 및 템플릿의 키를 반복 :

는 내가 뭔가를 할 수있어. 또는 (템플릿에) :

{% for s in status_choices %} 
    {% for entry in object_list %} 
    {% if entry.status == s %} 
     Render things 
    {% endif %} 
    {% endfor %} 
{% endfor %} 

그러나 데이터베이스를 I 상태로 하위 쿼리를받을 때마다 타격하지 않고이 작업을 수행 할 수있는 더 나은, 최적화 방법, 그리고 객체의리스트를 여러 번 반복하지 않고이 없다?

답변

1

당신은 당신이 요소가 렌더링 방식을 사용자 정의 할 수있는 regroup filter

{% regroup object_list by status as games_list %} 

<ul> 
{% for game in games_list %} 
    <li>{{ game.grouper }} 
    <ul> 
     {% for item in game.list %} 
      <li>{{ item}}</li> 
     {% endfor %} 
    </ul> 
    </li> 
{% endfor %} 
</ul> 

을 위해 수도를 찾고 있습니다,하지만 난 당신이 자신을 알아낼 수있게된다.

관련 문제