2

Я новичок в этом деле Django, и я решил начать с ClassBased GenericView, а не с более старой функцией Generics, которая вызвала пару камней преткновения, которые не имеют документации. Во всяком случае, до сих пор мне очень нравились GenericView и расширили их декораторами.Стиль кодирования Django: Должен ли я использовать декораторы классов здесь?

Простой пример того, что я делал

ideapad/urls.py

from ideapad.views import * 

urlpatterns = patterns('ideapad.views', 
     url(r'^$', IndexListView.as_view(), name='url_index'), 
     ) 

ideapad/views.py

from django.views.generic import ListView 
from ideapad.models import Idea 
from sauce.decorators import sort_queryset 

@sort_queryset('-date') 
class IndexListView(ListView): 
    model = Idea 
    template_name = 'ideapad/index.html' 
    context_object_name = 'ideas' 

sauce/decorators.py

def sort_queryset(default_sort): 
    """ 
    Decorator that sorts queryset according to GET data 
    Made to wrap GenericViews with get_queryset methods 
    """ 
    def decorator(cls): 
     fn=cls.get_queryset 
     def wrapper(self): 
      queryset = fn(self) 
      sortmethod = self.request.GET.get('sort', default_sort) 
      if hasattr(queryset, 'order_by'): 
       queryset = queryset.order_by(sortmethod) 
      return queryset 
     cls.get_queryset=wrapper 
     return cls 
    return decorator 

Вопрос в том, что для удобства чтения и ремонтопригодности существует ли «лучший» или «более приемлемый» способ сделать это? Или это просто предпочтение стиля кодирования?

Причина, о которой я прошу, в то время как я думаю, что это более читаемо таким образом, я хотел бы сделать деньги, делая это когда-нибудь, и не хочу развивать странные привычки кодирования, которые будут мочиться с коллегами так красиво очень ценится любой ввод в стиле кодирования. Благодарю.

ответ

3

Это правильный способ сделать это (я редактировал свой код):

ideapad/views.py

from django.views.generic import ListView 
from ideapad.models import Idea 
from sauce.decorators import SortQuerysetMixin 

class IndexListView(SortQuerysetMixin, ListView): 
    default_sort = '-date' 
    model = Idea 
    template_name = 'ideapad/index.html' 
    context_object_name = 'ideas' 

sauce/decorators.py

class SortQuerysetMixin(object): 
    def get_queryset(self): 
     queryset = super(SortQuerysetMixin, self).get_queryset() 
     sortmethod = self.request.GET.get('sort', self.default_sort) 
     if hasattr(queryset, 'order_by'): 
      queryset = queryset.order_by(sortmethod) 
     return queryset 
+0

Ну, он просто делает полностью слишком много смысл использовать MixIns, поскольку именно так были созданы GenericViews * facepalm *. Одно небольшое исправление (удалить декоратор), и это прекрасно. Спасибо за минуту и ​​спасибо за отличный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^