create () принимает 1 позиционный аргумент, но 3 было дано - PullRequest
0 голосов
/ 08 октября 2018

Я впервые создаю api rest с помощью django rest framework, я дошел до точки регистрации пользователей и регистрации их с токеном, моя проблема в том, что все это я мог сделать с пользователем по умолчанию Django, в моем случае янужен персонализированный пользователь, у которого есть другая логическая переменная с именем is_technical (is_technical).Я добавлю соответствующий код, который я сделал до сих пор, но чтобы было ясно, я хочу создать систему входа в систему с DRF и One-To-One Link ...

models.py (я пытался переопределить несколько разметод создания, но он не работает)

class Usuario(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    es_tecnico = models.BooleanField(name = 'es_tecnico', default = False, blank = True)

views.py

class UsuarioViewSet(viewsets.ModelViewSet):
    lookup_field = 'id'
    serializer_class = UsuarioSerializer
    queryset = Usuario.objects.all().filter(es_tecnico = False)


class TecnicoViewSet(viewsets.ModelViewSet):
    lookup_field = 'id'
    serializer_class = UsuarioSerializer
    queryset = Usuario.objects.all().filter(es_tecnico = True)


class PedidoViewSet(viewsets.ModelViewSet):
    lookup_field = 'id'
    serializer_class = PedidoSerializer
    queryset = Pedido.objects.all()


# class PedidoMiUsuarioSet(viewsets.ModelViewSet):
#     serializer_class = PedidoSerializer
#     queryset = Pedido.objects.all().order_by('-id').filter(autor = "3")

class Registrar(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = UsuarioSerializer

    def create(self, request, *args, **kwargs):
        #  Creando un nuevo usuario
        username = request.POST.get('user.username')
        password = request.POST.get('user.password')
        es_tecnico = request.POST.get('user.es_tecnico')
        print(username)

        user = User.objects.create_user(username, password)
        user.save()

        token = Token.objects.create(user=user)

        # usuario = Usuario.objects.create(user, es_tecnico)
        # usuario.save()

        return Response({'detail': 'El usuario fue creado con el token: ' + token.key})


class LoginView(mixins.CreateModelMixin, viewsets.GenericViewSet):
    serializer_class = LoginSerializer

    def create(self, request):
        serializer = LoginSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data["usuario"]
        django_login(request, user)
        token, created = Token.objects.get_or_create(user=user)
        return Response({"token": token.key}, status=200)


class LogoutView(mixins.CreateModelMixin, viewsets.GenericViewSet):
    authentication_classes = (TokenAuthentication, )

    def create(self, request):
        django_logout(request)
        return Response(status=204)
    enter code here

serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username',
                  'password')

class UsuarioSerializer(serializers.ModelSerializer):
    user = UserSerializer(required=True)
    class Meta:
        model = Usuario
        fields = ('user',
                  'es_tecnico')

    # def create(self, validated_data):
    #     """
    #     Overriding the default create method of the Model serializer.
    #     :param validated_data: data containing all the details of student
    #     :return: returns a successfully created student record
    #     """
    #     user_data = validated_data.pop('user')
    #     user = UserSerializer.create(UserSerializer(), validated_data=user_data)
    #     usuario, created = Usuario.objects.update_or_create(user=user,
    #                         es_tecnico=validated_data.pop('es_tecnico'))
    #     return usuario

# class TecnicoSerializer(serializers.ModelSerializer):
#     class Meta:
#         model = Tecnico
#         fields = ('id',
#                   'email',
#                   'password')


class PedidoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Pedido
        fields = ('id',
                  'tipo_de_pedido',
                  'autor',
                  'tecnico_asignado',
                  'asunto',
                  'detalles',
                  'prioridad',
                  'sistema',
                  'fecha',
                  'archivo_adjunto')


class LoginSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()
    def validate(self, data):
        username = data.get("username", "")
        password = data.get("password", "")
        if username and password:
            user = authenticate(username=username, password=password)
            if user:
                if user.is_active:
                    data["user"] = user
                else:
                    msg = "Usuario desactivado"
                    raise exceptions.ValidationError(msg)
            else:
                msg = "Imposible loguear con los parametros dados"
                raise exceptions.ValidationError(msg)
        else:
            msg = "Se necesita el username y password"
            raise exceptions.ValidationError(msg)
        return data

Если вам нужна дополнительная информация или код,Я знаю, я постараюсь ответить как можно скорее.Или, если вы порекомендуете другой фреймворк для работы с «пользовательскими пользователями», я оценю его

1 Ответ

0 голосов
/ 08 октября 2018

изменить

usuario = Usuario.objects.create(user, es_tecnico)

на

usuario = Usuario.objects.create(user=user, es_tecnico=es_tecnico)

в /misitio/pedidos/views.py, строка 58

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...