Джанго отдых действие получил неожиданный позиционный аргумент - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть viewset с действием, которое определено для добавления друзей в пользователя.Но у меня возникла проблема с URL, отправьте пост-запрос на http://localhost:8000/accounts/users/mercer/add_friend/ и получите это сообщение: add_friend () получил неожиданный аргумент ключевого слова 'username'

My ViewSet:

class UserViewSet(viewsets.ModelViewSet):
    queryset = CustomUser.objects.all()
    serializer_class = UserSerializer
    lookup_field = 'username'
    http_method_names = ['get', 'patch', 'post']

    @action(detail=True, methods=['post'])
    def add_friend(self, request):
        return Response('ok')

1 Ответ

0 голосов
/ 09 декабря 2018

Согласно документации Django Viewsets по маркировке дополнительных действий для маршрутизации :

Как и обычные действия, дополнительные действия могут быть предназначены как для отдельного объекта, так и для всей коллекции.Чтобы указать это, установите аргумент detail в True или False.Маршрутизатор настроит свои шаблоны URL соответственно.Например, DefaultRouter настроит подробные действия так, чтобы они содержали pk в своих шаблонах URL.

Когда вы объявили detail=True, вы указываете, что это действие будет применено в объекте CustomUser вместо всехваши пользователи.Я думаю, у вас есть это в вашем посте URL, так как вы, кажется, передаете "mercer" в качестве имени пользователя вашего объекта.Таким образом, вы также должны ожидать, что username будет передан в качестве аргумента в вашем методе действия:

@action(detail=True, methods=['post'])
def add_friend(self, request, username=None):
    # your code
    return Response('ok')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...