Opciones de Django para hacer que las variables estén ampliamente disponibles
Pregunta
Cada vez que abro una página, quiero obtener la identificación del proyecto actualmente activa. Esto se realizará al bloquear el subdominio y verificar que el usuario actualmente conectado puede verlo.
Una vez que llegue a mi vista, quiero poder hacerlo
tasks = Task.objects.filter(project = current_project)
WHere current_project (o CURRENT_PROJECT o current_project ???) ya se ha configurado.
¿Alguien puede explicar los pros / contras de los diversos enfoques que he encontrado en los documentos y ponerme en el camino correcto?
- Sesiones
- Middleware
- Enhebrado
- incorporados
Así fue como lo hice al final:
Decorador:
def check4project(fn):
current_project = 'fred'
def check(*args, **kw):
kw['project']=current_project
return fn(*args, **kw)
return check
Ver ejemplo
@login_required
@check4project
@tweetpost
def index(request, project=0):
print project
Solución
Todo depende de cuál sea su semántica del " proyecto actual " son. Aquí hay algunas posibilidades:
-
Podría ser una característica del usuario: visita su página de perfil y establece un proyecto actual. Esto se almacenaría en la base de datos y accedería a él con el ORM.
-
Podría ser una característica de la URL, basada únicamente en el subdominio. Esto podría hacerse con middleware, que tiene acceso a la solicitud, y podría, por ejemplo, analizar el nombre de host y establecer un atributo personalizado en la solicitud a la que podría acceder en sus funciones de vista.
-
Similar al # 2, podría usar un decorador de vistas si se verifican proyectos para algunas vistas pero no para todas. Esto es similar a los decoradores de Django para verificar la autorización.
-
Podría ser una característica de la visita del usuario al sitio: visita una página de proyectos, elige uno para trabajar y queda pegajoso hasta que elige otro proyecto. Esto se almacenaría mejor en la sesión, que es específicamente para este tipo de almacenamiento transitorio.
Según su descripción, parece que # 2 o # 3 es lo mejor para usted, dependiendo de cómo sus puntos de vista se dividan entre preocuparse por los subproyectos y no.
Otros consejos
Podría crear un procesador_contexto y luego obtener su valor del objeto de solicitud.
¿Ha considerado un etiqueta de plantilla personalizada ?