python - Django 编码风格 : Should I be using class decorators here?

标签 python django coding-style decorator django-generic-views

我对整个 Django 事物都是新手,因此,我决定从 ClassBased GenericViews 开始,而不是旧的基于函数的泛型,这导致了一些由于缺乏文档而造成的障碍。不管怎样,到目前为止我真的很喜欢 GenericViews 并且一直用装饰器来扩展它们。

我一直在做的简单例子

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

我的问题是,就整体可读性和可维护性而言,是否有“更好”或“更可接受”的方法来做到这一点?或者这只是一种编码风格偏好?

我问这个问题的原因是,虽然我认为这种方式更具可读性,但我希望有一天能通过这样做来赚钱,并且不想养成奇怪的编码习惯,这会惹恼同事非常感谢任何有关编码风格的意见。谢谢。

最佳答案

这是执行此操作的正确方法(我已经编辑了您的代码):

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

关于python - Django 编码风格 : Should I be using class decorators here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10157173/

相关文章:

python 根据日期将列表列表中的列表元素求和为唯一

python - Django 模型的额外参数

javascript - 使用 Javascript 和 Jquery 为列表中的每个条目动态创建表

java - 在 Java 中,公共(public)构造函数似乎总是一种糟糕的编码习惯

php - 一堆互相调用的小函数。更好的方式来组织我的代码?

c# - 在 C# 中隐藏大括号

python - 将 C++ 类移植到 PyQt

python - matplotlib中的y_label被截断

python - 如何在 Python 中将 RFC 822 时间戳转换为人类可读的格式?

python - 如何在django中将普通数字转换为阿拉伯数字