在基于类的视图中获取 url kwargs

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)

但是,我不知道是否还有其他方法,这就是为什么我仍然想问我的问题。

Bal*_*zok 5

感谢@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