一種方法是有類裝飾只是setattr
一些對象,它將包含所有as_views
你想要定義。然後,您可以使用您的urls.py
import re
class Views(object):
"""Empty object for holding as_view method"""
views = Views()
def convert_name(name):
"""convert CapWords into cap_words"""
return name[0].lower() + re.sub(r'([A-Z])', lambda m:"_" + m.group(0).lower(), name[1:])
def as_view(views):
"""Adds decorated class-based views' as_view methods to views container"""
def decorator(cls):
name = convert_name(cls.__name__)
setattr(views, name, cls.as_view)
return cls
return decorator
,然後在views.py你會使用這樣的:
from as_view_decorator import views, as_view
@as_view(views)
class MyView(View):
....
..和MyView.as_view
將被存儲在views
對象上views.my_view
。
你也可以做你的views.py是這樣的:
from as_view_decorator impor as_view
import sys; mod = sys.modules[__name__]
@as_view(mod)
class MyView(View):
...
這將設置my_view
爲您views
模塊上的屬性。然後,您可以在您的urls.py
:
from app.views import my_view
urlpatterns = patterns('',
url(r'^$', my_view()),
)
我覺得做my_view = MyView.as_view
是非常簡單和可讀性,所以我坦率地喜歡我自己。
整個'as_view'事情是爲了讓它很明顯,類將被實例化每個請求一次,所以你不會試圖存儲它們的狀態。所以任何解決方案都需要保持這個。 –