2009-09-13 9 views
5

Cada vez que abro una página deseo obtener el ID del proyecto actualmente activo. Esto se hará chapando el subdominio y verificando que el usuario actualmente conectado pueda verlo.Opciones de Django para hacer que las variables estén ampliamente disponibles

Una vez que llego a mi punto de vista que quieren ser capaces de hacer

tasks = Task.objects.filter(project = current_project) 

DÓNDE current_project (o CURRENT_PROJECT o current_project ???) ya ha sido configurado.

¿Alguien puede explicar los pros/contras de los diversos enfoques que he encontrado en los documentos y ponerme en el camino correcto?

  1. Sesiones
  2. Middleware
  3. de roscado
  4. órdenes internas

Así fue como lo hice en el 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 

Respuesta

4

Todo depende de la semántica del "proyecto actual". Aquí hay algunas posibilidades:

  1. 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 usted tendría acceso a ella con el ORM.

  2. 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 las funciones de visualización.

  3. Al igual que en el n. ° 2, puede usar un decorador de vistas si se realizan comprobaciones de proyectos para algunas vistas pero no para todas. Esto es similar a los decoradores de Django para verificar la autorización.

  4. Podría ser una característica de la visita del usuario al sitio: visita una página de proyectos, elige una para trabajar, y está pegajosa hasta que elige otro proyecto. Esto se almacenaría mejor en la sesión, que es específicamente para este tipo de almacenamiento transitorio.

Desde su descripción, se sounsd como # 2 y # 3 es la mejor para usted, dependiendo de cómo sus puntos de vista dividen entre preocuparse por subproyectos y no.

+0

Gracias por su útil respuesta, me ha ayudado a aclarar las diversas opciones. Me gusta el sonido de 3. porque es una manera fácil de validar que el usuario tenga acceso al proyecto al mismo tiempo y la mayoría pero no todas las vistas deben conocer el proyecto. – PhoebeB

+0

+1 para decorador de vistas. –

0

¿Ha considerado un custom template tag?

+0

Principalmente quiero que aparezca en la vista antes de llamar a la plantilla, pero gracias por la contribución. – PhoebeB

1

Puede hacer un context_processor y luego obtener su valor del objeto de solicitud.

+0

un context_processor no sería la mejor solución para este problema, ¡pero resuelve otro que estaba teniendo! Gracias. – PhoebeB

Cuestiones relacionadas