我在基于django类的视图中有一个方法,如名为get_player_stats
。从这个方法我想在同一个类中调用另一个方法,但我无法。代码如下:
class ScoreView(TemplateView):
def get_player_stats(request):
player_id = request.GET.get(player_id, None)
# compute player stats
#here I want to call like below:
self.get_team_stats(player_id)
def get_team_stats(self, player_id):
#compute team stats
当我运行它时,它会显示name 'self' is not defined
如果我尝试def get_player_stats(self, request):
,则会显示missing 1 required positional argument: 'request'
如果我尝试def get_player_stats(request, self):
,则会显示missing 1 required positional argument: 'self'
如何从get_team_stats
致电get_player_stats
?
这非常令人沮丧,非常感谢任何帮助
P.S:我通过定义如下的URL路径将get_player_stats
称为ajax调用:
url('score/get_player_stats', views.ScoreView.get_player_stats)
然后我使用$ .ajax和url: '/score/get_player_stats'
答案 0 :(得分:4)
我在这里看到2个问题:
class-based views
django
的误解
object-
class-
和python
方法的误解
醇>
让我们更详细地看一下。
一定听起来很奇怪(特别是对于新手)但是django中的class-based view
并不意味着你将objects
/ classes
的方法绑定到url
- 路线。
更多:
django.urls.path
只能使用fn(request, *args, **kwargs)
it's better explicite
的Pythonic self
- param使object-methods
无法使用views
(至少没有“特殊魔法”)。
那么class-based views
的含义是什么?
事实上它非常简单:
class-based view
公开了类方法as_view
as_view
是高阶函数,不会直接用于path
/ url
次调用。as_view
在运行时构造实际的视图函数get
/ post
/ put
/ head
- 方法,在它们存在时调用它们,并在不存在时引发异常。 所以你可以看到“人们不会简单地将类视图的方法绑定到django中的url-routes”。
这种工具几乎不适用于一般情况,在需要这种不灵活性的情况下效果很好。
object-
,class-
,static-
方法行。现在第二个问题。
我们可以使用class-based view
其他方法的方法调用吗?
是的,我们可以但有一些限制。
让我们看一下django 2.0中的one-file
demo。 (对于1.11 - %s/path/url/g
)
from django.urls import path
from django.http import HttpResponse
from django.utils.decorators import classonlymethod
# CASE 1: normal function - OK
def just_a_fun(request, **kwargs):
context = kwargs if kwargs else {"method": "just a function"}
return HttpResponse('method = %(method)s' % context)
class ViewClass(object):
def get(self, request, **kwargs):
return just_a_fun(request, **kwargs)
# CASE 2: Object method - FAIL, not possible to use in `django.url.path`-calls
def om_view(self, request):
return self.get(request, **{"method": "object method"})
# CASE 3: class method - OK
@classmethod
def cm_view(cls, request):
return cls.get(cls, request, **{"method": "class method"})
# CASE 4: static method - FAIL, not possible to call `cls.get` or `self.get`
@staticmethod
def sm_view(request):
self = None # This is a problem with static methods
return self.get(self, request, **{"method": "static method"})
# CASE 5: HOF-view, similar to django.views.generic.View.as_view - OK
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, **kwargs):
self = cls(**initkwargs) # Object construction
self.request = request
self.kwargs = kwargs
return self.get(request, **{"method": "HOF as_view"})
return view
urlpatterns = [
path("just-a-fun", just_a_fun), # OK
path("object-method",
ViewClass.om_view), # Problem: redundant `self` for `path`
path("class-method", ViewClass.cm_view), # OK
path('static-method',
ViewClass.sm_view), # Problem: not possible to call `get`
path('hof-view', ViewClass.as_view()), # OK.
]
要点:
path
/ url
调用中使用,但不能使用其他类方法django.views.generic
源代码以获取灵感...
我希望必须澄清事情,但问题,批评,更正 - 欢迎你!