string作为CBV的url dispatcher中的第二个参数

时间:2013-11-25 16:41:02

标签: python django django-class-based-views

在基于课程的观看之前,urls.py看起来像这样:

urlpatterns= patterns('mypackage.views',
                      url(r'^$', 'home', name='home'),
                      url(r'other', name='other'),
                      )

现在我的家庭观点是基于班级的。由于我喜欢一致性,我希望将视图类保持为字符串。我试过了:

urlpatterns= patterns('mypackage.views',
                      url(r'^$', 'Home.as_view', name='home'),
                      url(r'Other.as_view', name='other'),
                      )

我得到Parent module mypackage.views.Home does not exist。如果我只是给出类名:

urlpatterns= patterns('mypackage.views',
                      url(r'^$', 'Home', name='home'),
                      url(r'Other', name='other'),
                      )

我得到:__init__ takes exactly 1 argument, 2 given

有没有办法将字符串作为第二个参数传递给CBV的url函数和FBV而不是from mypackage.views import *

修改: 似乎没有内置的解决方案。在这种情况下:为什么字符串作为第二个参数允许使用url函数:它是否违反了zen(“只有一种方法可以执行此操作)?

2 个答案:

答案 0 :(得分:2)

您应该导入基于类的视图并以这种方式指定它们:

from mypackage.views import *

urlpatterns = patterns('mypackage.views',
                       url(r'^$', Home.as_view(), name='home'),
                       url(r'other', Other.as_view() name='other'),
                       )

另请注意,您的url()调用应该有三个参数:网址格式,视图和名称(您编写的某些示例并不包含所有这些参数)。

答案 1 :(得分:2)

如果您想将视图作为字符串传递,那么在您的视图中执行以下操作:

class Home(View):
    pass

home = Home.as_view()

然后在你的网址中:

url(r'^$', 'mypackage.views.home', name='home'),

您需要使用完整路径。