Bal*_*zok 3 python django django-urls django-views django-class-based-views
我需要在基于类的视图中检索 url 中写入的 pk 值:
path('<int:pk>/data/', views.DataView.as_view(), name='data'),
Run Code Online (Sandbox Code Playgroud)
get然而,我到处看到的是在or等方法的定义中检索到的 pk post。
我想要的是能够使用它来定义我的类变量,因为我需要在类中的每个方法中从这个 pk 中获取相同的值,如下所示:
class DataView(ContextMixin, UpdateView):
pk = get_pk_from_url
...
value = ...
def get(self, request, *args, **kwargs):
value = self.value
# Do something with value
def post(self, request, *args, **kwargs):
value = self.value
# Do something with value
Run Code Online (Sandbox Code Playgroud)
我在写这个问题时得到了一个想法,那就是定义一个可以完成我需要的方法,然后在我的其他方法中调用这个方法。
class DataView(ContextMixin, UpdateView):
def get_value(self):
self.pk = self.kwargs['script_id']
...
self.value = ...
def get(self, request, *args, **kwargs):
self.get_value()
value = self.value
# Do something with value
def post(self, request, *args, **kwargs):
self.get_value()
value = self.value
# Do something with value
Run Code Online (Sandbox Code Playgroud)
但是,我不知道是否还有其他方法,这就是为什么我仍然想问我的问题。
感谢@WillemVanOnsem 的评论,我能够使用该setup方法(此处为文档)来定义我需要定义的所有内容。所以最后我得到了类似的东西:
class DataView(View):
def setup(self, request, *args, **kwargs):
self.pk = kwargs['pk']
...
self.value = ...
return super().setup(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
value = self.value
def post(self, request, *args, **kwargs):
value = self.value
Run Code Online (Sandbox Code Playgroud)
在和setup之前调用的方法,其中声明的类属性可以在其他方法中使用。getpost