【问题标题】:django class-based view unexpected keyword argumentdjango 基于类的视图意外关键字参数
【发布时间】:2018-07-18 09:37:24
【问题描述】:

我有一个旧代码:

我的网址:

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(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'

【问题讨论】:

  • 这不是self.request 的一部分。它是self.kwargs 的一部分,字段名称是here field_name。所以self.kwargs['field_name'].
  • @WillemVanOnsem 你能检查我的帖子更新吗?
  • 顺便说一句,使用基于类的视图并不意味着您需要将所有内容都设为类。像使用CheckUniqueFieldValue.check_uniqueness 一样使用类方法并不是很Pythonic。不过,如果您在视图本身上创建了 check_uniqueness 方法,那么您可以通过 self.check_uniqueness 调用它。
  • @DanielRoseman 谢谢你的建议,我会考虑的。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2016-07-28
    • 2013-10-29
    • 2022-01-18
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多