отсутствует 1 обязательный позиционный аргумент: «запрос» django restframework

Я использовал маршрутизаторы для создания URL-адресов, теперь я хочу создать URL-адреса для своего API, но проблема в том, что я получаю сообщение об ошибке

createuser() отсутствует 1 обязательный позиционный аргумент: 'запрос'отсутствует 1 обязательный позиционный аргумент: 'запрос'

Я получаю ту же ошибку для всех моих методов внутри класса UserAuthAPIView, я уже читал решения в stackoverflow, но они не работают в моем случае.

У меня есть много методов в классе UserAuthAPIView, и я хочу создать URL-адреса для всех из них.

для например

127.0.0.1:8000/api
127.0.0.1:8000/api/createuser
127.0.0.1:8000/api/login
127.0.0.1:8000/api/<pk>/viewuser

urls.py

from django.conf.urls import url
from UserAPI.api import views
from  UserAPI.api.views import UserAuthAPIView

urlpatterns = [
    url(r'^$', UserAuthAPIView.as_view({'get': 'list'}), name='user-list'),
    url(r'createuser/$', views.UserAuthAPIView.createuser, name='user-create'),
    #url(r'userlogin/$', views.UserAuthAPIView.userlogin, name='user-login'),
]

views.py

class UserAuthAPIView(ModelViewSet):
    queryset = UserModel.objects.all()
    serializer_class = ListViewSerializer

    def get_object(self, queryset=None):
        return self.request.user

    @action(methods=['post'], detail=False, permission_classes=[AllowAny], serializer_class=UserSerializer)
    def createuser(self, request, *args, **kwargs):
        data = request.data
        serializer = UserSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
        return Response({ "status" : "user created successfully"}, status=HTTP_201_CREATED)

person Vikas Gautam    schedule 21.11.2018    source источник


Ответы (2)


Маршрутизаторы выполняют несколько операций над набором представлений и, в частности, добавляют сопоставление HTTP-глаголов с соответствующими функциями.

Вам нужно сделать что-то подобное для вашего действия:

urlpatterns = [
    url(r'^$', UserAuthAPIView.as_view({'get': 'list'}), name='user-list'),
    url(r'createuser/$', views.UserAuthAPIView.as_view({'post': 'createuser'}), name='user-create'),
]
person Linovia    schedule 21.11.2018
comment
я получаю сообщение об ошибке AttributeError: объект «функция» не имеет атрибута «as_view» - person Vikas Gautam; 21.11.2018
comment
Плохо, действительно, должно быть views.UserAuthAPIView.as_view - person Linovia; 21.11.2018
comment
я не получаю никаких ошибок, но мои поля формы не отображаются. когда я попытался поместить оператор печати внутри createuser, я обнаружил, что createuser не работает, когда URL-адрес 127.0.0.1:8000/api/createuser - person Vikas Gautam; 21.11.2018
comment
это пост, а не гет. - person Linovia; 21.11.2018
comment
url(r'createuser/$', views.UserAuthAPIView.as_view({'post': 'createuser'}), name='user-create'), - person Vikas Gautam; 21.11.2018
comment
это то, что я использую и до сих пор не получаю поля формы - person Vikas Gautam; 21.11.2018

Вы неправильно называете Viewset в URL-адресах. Вам нужно сделать это так:

router = routers.DefaultRouter()
router.register(r'auth', UserAuthAPIView)

urlpatterns = [
    url(r'^', include(router.urls)),
]

Or

urlpatterns = [
    url(r'createuser/$', UserAuthAPIView.as_view({'post':'createuser'}),
]
person ruddra    schedule 21.11.2018
comment
маршрутизатор создает такие URL-адреса, как 127.0.0.1:8000/api/createuser, что мне и нужно, но он также создаст URL-адрес 127.0.0.1:8000/api/createuser/‹anything›/ - person Vikas Gautam; 21.11.2018
comment
какой должен быть URL-адрес, если я хочу получить доступ к любому методу внутри класса UserAuthAPIView, потому что as_view() выдает ошибку AttributeError: объект «функция» не имеет атрибута «as_view» - person Vikas Gautam; 21.11.2018
comment
Ну, не должно. Вы можете использовать обновленный ответ, данный Linovia, или последнюю часть моего ответа :) - person ruddra; 21.11.2018
comment
и URL-адрес по умолчанию маршрутизатора не будет создавать createuser/<anything>/, он создаст createuser <anything>/ (пробел без косой черты) - person ruddra; 21.11.2018
comment
я попробовал маршрутизатор, и проблема в том, что URL-адрес 127.0.0.1:8000/api/auth/ ‹что-либо› не выдает ошибку, страница не найдена, вместо этого я получаю данные в ответ - person Vikas Gautam; 21.11.2018
comment
это должно быть /api/auth/createuser/ или /api/auth/createuser <anything>/ - person ruddra; 21.11.2018