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

时间:2018-07-18 09:37:25

标签: django django-rest-framework django-class-based-views

我有一个旧代码:

我的网址:

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

我的观点:

 def check_unique_username(request, field_value):
        return HttpResponse(check_unique_filed_value(request, "username", field_value))

localhost:8000/check_unique_username/myusername

完美搭配

但是现在我想使其成为基于类的:

url:

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

视图:

class CheckUniqueUsername(APIView):

    def get(self):
        return HttpResponse(CheckUniqueFieldValue.check_uniqueness("username", self.request.get('username')))

扬起

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']))

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

1 个答案:

答案 0 :(得分:4)

这些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'])
        )

未命名参数存储在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)
        )