Django 的基于类 View 的 as_view() 语法一直困扰着我。基本上,我厌倦了必须为每个我想使用的基于类的 View 执行 my_view = MyView.as_view() (或者将 as_view() 放在我使用基于 c 的 View 的每个 url conf 的每一行中)。我认为类装饰器将是实现此目的的一种更简洁的方法,并且我正在尝试找出如何实现这一点,对于我自己的代码并在 django 片段上共享,以防其他人感兴趣。所以我的问题是:是否有一种合理的方法来实现“as_view”装饰器,以便以下代码可以正常工作?
@as_view(my_view)
class MyView(View):
pass
这基本上相当于:
class MyView(View):
pass
my_view = MyView.as_view()
谢谢,这也帮助我学习了python的高级功能(即装饰器)。
本
最佳答案
想到的一种方法是让类装饰器只是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.my_view
存储在 views
对象上。
你也可以在你的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
非常简单且可读,所以坦率地说,我自己更喜欢这样做。
关于python - as_view()(对于基于类的 View )可以在装饰器中实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7086272/