2013-09-28 103 views
0

我在index view下面的代码在views.py组织代码视图

def index(request): 
     # Count all active polls for posting on the index page. 
     all_active_polls = Poll.objects.filter(pub_date__lte=timezone.now(), 
               is_active=True 
              ).order_by('-pub_date') 
     num_of_active_polls = len(all_active_polls) 
     # Count all inactive polls for posting on the index page. 
     all_inactive_polls = Poll.objects.filter(pub_date__lte=timezone.now(), 
               is_active=False 
               ).order_by('-pub_date') 
     num_of_inactive_polls = len(all_inactive_polls) 
     # Make the list of the last 5 published polls. 
     latest_poll_list = Poll.objects.annotate(num_choices=Count('choice')) \ 
       .filter(pub_date__lte=timezone.now(), 
         is_active=True, 
         num_choices__gte=2) \ 
       .order_by('-pub_date')[:5] 
     return render(request, 'polls/index.html', { 
      'latest_poll_list': latest_poll_list, 
      'num_of_active_polls': num_of_active_polls, 
      'num_of_inactive_polls': num_of_inactive_polls 
      }) 

在索引页我想有一个列表我的最后5个(或更多,并不重要)民意调查。 然后我想要两个链接:View all active polls(number of polls)View all closed polls(number of polls)。所以我需要在index视图代码中对它进行计数。 但是,我不确定这是放置此代码的最佳位置(即计数活动和非活动民意测验的数量)。

也可能我会在其他一些视图中需要这个数字,所以我会将这段代码复制到这个视图中?我认为它很痛DRY和Django重点坚持DRY原则。

那么,我该如何重组这个代码,使其更合乎逻辑,而不是伤害了原理?

回答

2

使用managers使其更干,始终遵循原则 - 胖模型,薄视图。 这里是这样做的一种方法:

models.py

class ActiveManager(models.Manager): 
    def get_query_set(self, active=True): 
     return super(ActiveManager, self).\ 
      get_query_set().filter(pub_date__lte=timezone.now(), is_active=active)\ 
          .order_by('-pub_date') 

class InctiveManager(InctiveManager): 
    def get_query_set(self): 
     return super(InctiveManager, self).get_query_set(is_active=False) 

class LatestManager(InctiveManager): 
    def get_query_set(self): 
     return super(LatestManager, self).get_query_set(is_active=True)\ 
             .filter(num_choices__gte=2)\ 
             .annotate(num_choices=Count('choice')) 

class Poll(models.Model): 
    ... 

    objects = models.Manager() 
    active = ActiveManager() 
    inctive = InctiveManager() 
    latest = LatestManager() 

views.py

all_active_polls = Poll.active.all() 
num_of_active_polls = len(all_active_polls) 

all_inactive_polls = Poll.inactive.all() 
num_of_inactive_polls = len(all_inactive_polls) 

latest_poll_list = Poll.latest.all()[:5] 
1

我必须问,有没有一个原因,你没有使用class based views

你可以有一个ListViewn最后投票在那里你可以在get_queryset方法 不同的queryset另一个ListView控件定义号码,如果你愿意的或不同的一个视图可以使用相同的模板。 另一个列表查看所有封闭的民意调查。

如果您想要在所有视图中使用很多自定义代码,只需编写一个混合,以便您的所有其他基于类的视图都将继承。