Django conseguir etiquetado en información de usuario fuera de las vistas. py
He estado trabajando en DRF. Normalmente prefiero escribir lógica de negocio en otro archivo de pitón en lugar de vistas. Py. Intenté tener la corriente registrada en el usuario en las vistas. py
self.request.user
Pero no sé cómo puedo obtener la misma información de usuario en mi archivo de lógica de negocio aquí es lo que he venido hasta ahora en Views. py
class AddBusCompanyStaffView(generics.CreateAPIView):
serializer_class = AddBusCompanyUserSerializer
def get_bus_company(self):
return GetBusCompanyUseCase(bus_company_id=self.kwargs.get('bus_company_id')).execute()
def perform_create(self, serializer):
print(self.request.user)
return AddBusCompanyUserUseCase(serializer=serializer,
bus_company=self.get_bus_company()
).execute()
Quiero user
en mi sección de lógica de negocio aquí...
User = get_user_model()
class AddBusCompanyUserUseCase(BaseUseCase):
"""
use this to add bus company of specific bus company
"""
def __init__(self,
serializer: bus_company_user_serializers.AddBusCompanyUserSerializer,
bus_company: BusCompany):
self.serializer = serializer
self._data = serializer.validated_data
self._bus_company = bus_company
def execute(self):
self._factory()
def _factory(self):
user_position = self._data.pop('position')
user_password = self._data.pop('password')
user = User(**self._data)
user.set_password(user_password)
user.save()
bus_company_user=BusCompanyStaff(user=user,
position=user_position,
staff_of=self._bus_company,
created_by= #logged in user here
)
¿Cómo puedo conseguir auto.request.user en created_by? mi maleta base es
class BaseUseCase:
"""
Base Use Case
"""
def execute(self):
raise NotImplementedError("Subclasses should implement this!")
def _factory(self):
raise NotImplementedError("Subclasses should implement this!")
def is_valid(self):
return True
Pregunta hecha hace 3 años, 4 meses, 29 días - Por scriptsculptorbf10
3 Respuestas:
-
Ya que no puedes cambiar tu Base UseCase, tienes que añadir el atributo a la clase AddBusCompanyUserUseCase.
La clave aquí es pasar auto.request.user a su AddBusCompanyUserUseCase cuando se crea para que pueda acceder más tarde como atributo auto.usuario.
#usecases.py class AddBusCompanyUserUseCase(BaseUseCase): """ use this to add bus company of specific bus company """ def __init__(self, serializer: bus_company_user_serializers.AddBusCompanyUserSerializer, bus_company: BusCompany, user: None, ): self.serializer = serializer self._data = serializer.validated_data self._bus_company = bus_company self.user = user def execute(self): self._factory() def _factory(self): user_position = self._data.pop('position') user_password = self._data.pop('password') user = User(**self._data) user.set_password(user_password) user.save() bus_company_user=BusCompanyStaff(user=user, position=user_position, staff_of=self._bus_company, created_by= self.user ) # views.py class AddBusCompanyStaffView(generics.CreateAPIView): serializer_class = AddBusCompanyUserSerializer def get_bus_company(self): return GetBusCompanyUseCase(bus_company_id=self.kwargs.get('bus_company_id')).execute() def perform_create(self, serializer): print(self.request.user) return AddBusCompanyUserUseCase(serializer=serializer, bus_company=self.get_bus_company(), user=self.request.user, ).execute()
Respondida el Dec 17, 2020 a las 09:48 - por Brian
Votos positivos: 0 | Votos negativos: 0 -
Para acceder al usuario en cualquier parte de tu código de Django, incluyendo tus clases de lógica de negocio fuera de las vistas, puedes utilizar la función
get_current_user
de Django, que te permite acceder al usuario actual que está haciendo la solicitud. Aquí te muestro cómo puedes integrarlo en tu código:En tu archivo de lógica de negocio, puedes importar
get_current_user
de Django y llamarlo para obtener el usuario actual. Luego puedes pasarlo como argumento a tu caso de usoAddBusCompanyUserUseCase
. Aquí está cómo puedes hacerlo:python from django.contrib.auth import get_user_model from django.contrib.auth.models import AnonymousUser User = get_user_model() class AddBusCompanyUserUseCase(BaseUseCase): """ use this to add bus company of specific bus company """ def __init__(self, serializer: bus_company_user_serializers.AddBusCompanyUserSerializer, bus_company: BusCompany, created_by: User = None):
Añade created_by aquí como argumento opcional
self.serializer = serializer self._data = serializer.validated_data self._bus_company = bus_company self._created_by = created_by def execute(self): self._factory() def _factory(self): user_position = self._data.pop('position') user_password = self._data.pop('password') user = User(**self._data) user.set_password(user_password) user.save() created_by = self._created_by if created_by is None or isinstance(created_by, AnonymousUser): created_by = get_current_user()Obtén el usuario actual si created_by no se proporciona
bus_company_user = BusCompanyStaff(user=user, position=user_position, staff_of=self._bus_company, created_by=created_by )De esta forma, puedes proporcionar el usuario actual al momento de crear un
BusCompanyStaff
dentro de tu lógica de negocio. Es importante tener en cuenta que el usuario puede serAnonymousUser
si no está autenticado, por lo que es una buena práctica verificar si es un usuario válido antes de pasarlo como argumento.Respondida el Dec 18, 2020 a las 09:43 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para acceder a la información del usuario autenticado en tu archivo de lógica de negocio, puedes pasar el request como argumento al constructor de la clase de caso de uso. Aquí tienes un ejemplo modificado de tu código:
En
views.py
:python class AddBusCompanyView(generics.CreateAPIView): serializer_class = AddBusCompanyUserSerializer def get_bus_company(self): return GetBusCompanyUseCase(bus_company_id=self.request.data.get('bus_company_id')).execute() def perform_create(self, serializer): return AddBusCompanyUserUseCase(serializer=serializer, bus_company=self.get_bus_company(), request=self.request
Pass the request object
).execute()En
use_cases.py
:python class AddBusCompanyUserUseCase(BaseUseCase): """ use this to add bus company of specific bus company """ def __init__(self, serializer: bus_company_user_serializers.AddBusCompanyUserSerializer, bus_company: BusCompany, request: HttpRequest):
... Previous code ...
self.request = request def _factory(self):... Previous code ...
bus_company_user = BusCompanyUser(user=user, position=user_position, bus_company=self._bus_company, created_by=self.request.userAccess the authenticated user here
)... Remaining code ...
Con estos cambios, puedes acceder a la información del usuario autenticado (
request.user
) en tu clase de caso de uso y utilizarla para establecer el valor decreated_by
.Respondida el Dec 18, 2020 a las 09:54 - por Gemini
Votos positivos: 0 | Votos negativos: 0