django 基于类的视图意外关键字参数

hsb*_*r13 2 django django-class-based-views django-rest-framework

我有一个遗留代码:

我的网址:

url(r'^check_unique_username/(?P<field_value>(.*?){1,150})/$',
        auth.views.check_unique_username, name='check_unique_username'),
Run Code Online (Sandbox Code Playgroud)

我的看法:

 def check_unique_username(request, field_value):
        return HttpResponse(check_unique_filed_value(request, "username", field_value))
Run Code Online (Sandbox Code Playgroud)

完美配合localhost:8000/check_unique_username/myusername

但现在我想让它基于类:

网址:

url(r'^check_unique_username/(?P<field_value>(.*?){1,150})/$',
        auth.views.CheckUniqueUsername.as_view(), name='check_unique_username'),
Run Code Online (Sandbox Code Playgroud)

看法:

class CheckUniqueUsername(APIView):

    def get(self):
        return HttpResponse(CheckUniqueFieldValue.check_uniqueness("username", self.request.get('username')))
Run Code Online (Sandbox Code Playgroud)

这引发了

TypeError: get() got an unexpected keyword argument 'username'

我应该怎么办?tnx


更新: 我将我的观点更改为:

class CheckUniqueUsername(APIView):

    def get(self):
        return HttpResponse(CheckUniqueFieldValue.check_uniqueness("username", self.kwargs['field_value']))
Run Code Online (Sandbox Code Playgroud)

但仍然收到错误 TypeError: get() got an unexpected keyword argument 'field_value'

Wil*_*sem 5

这些 URL 参数存储在 中self.kwargs,因此您可以使用 来访问这些参数self.kwargs['field_name']。但这些参数默认情况下也会传递给getpost等函数。所以你需要抓住这些(并可以选择忽略):

class CheckUniqueUsername(ApiView):

    def get(self, request, *args, **kwargs):
        return HttpResponse(
            CheckUniqueFieldValue.check_uniqueness("username", self.kwargs['field_name'])
        )
Run Code Online (Sandbox Code Playgroud)

未命名的参数存储在self.args. 因此,您可以将基于类的视图视为某种函数,它将和作为属性def view(request, *args, **kwargs)存储在实例中。argskwargs

或者更方便的是直接使用这些:

class CheckUniqueUsername(ApiView):

    def get(self, request, *args, field_name=None, **kwargs):
        return HttpResponse(
            CheckUniqueFieldValue.check_uniqueness("username", field_name)
        )
Run Code Online (Sandbox Code Playgroud)