2012-09-12 7 views
9

Aquí está el código en mi cabecera base.htmlMi plantilla de Django variable booleana no está funcionando como se esperaba en javascript

<script> 
     var auth_status = "{{ user.is_authenticated }}" 
    </script> 

    {% block scripts %} {% endblock %} 

El resto de los scripts en mi sitio son en los guiones de bloque.

En una plantilla hija (dentro del bloque de script y dentro de etiquetas de script) Tengo este código,

  if (auth_status) { 
      //something 
     } 

El error en cuestión es auth_status siempre es cierto, cuando debería ser encendido y apagado dependiendo de si el usuario ha iniciado sesión. Request_context se está transfiriendo a la plantilla, por lo que no debería ser el error.

Gracias

+2

agradable a la vista sin relación a su pregunta, pero tenga en cuenta que no hacer 'si (user_is_authenticated) {hacer cosas; } 'puede ser un problema de seguridad si realmente confías en el valor de esta variable JS. Un usuario podría modificar el valor de la variable JS antes de la ejecución. –

+0

¿De modo que dices que un usuario puede establecer de alguna manera auth_status = true? Entonces, ¿pasar por alto js var sería una solución válida? Ej .: if ({{user.is_authenticated | yesno: "true, false"}}) versus if (auth_status) ?? –

+1

Un usuario malintencionado podría simplemente extraer el código fuente de su página y reemplazar lo que quiera con ... lo que quiera. Hay ** manera ** de implementar ** cualquier ** cliente de seguridad (es decir, en JS) y ** no hay solución **, todo el control de seguridad/acceso debe hacerse desde el servidor (eso es, en tu código de Python). JS no es una extensión de su código de aplicación que se ejecuta dinámicamente, es * algo diferente *, con diferentes restricciones. –

Respuesta

52

Por lo que veo la variable de auth_status parece ser una cadena, no un valor lógico. Una variable con una cadena no vacía en JavaScript evaluará a true en una cláusula if.

De todos modos, algo así como

<script> 
    var auth_status = {{ user.is_authenticated }}; 
</script> 

no funcionará porque eso va a generar este código HTML:

<script> 
    var auth_status = True; 
</script> 

Como se uppercased verdadera booleano de Python.

Esto debería hacer la traducción de Python para Javascript:

<script> 
    var auth_status = {{ user.is_authenticated|yesno:"true,false" }}; 
</script> 

docs Comprobar Yesno aquí: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno

+1

+1 Buena respuesta y buen uso de 'yesno'. –

+0

¡Guau! Muchas gracias, ¡pasé por alto por completo la diferencia mayúscula/minúscula en los dos idiomas! –

+0

Una solución más general para pasar vars de Python a JS vars es usar json. En py: context ['foo'] = json.dumps (a_py_list). En la plantilla . Esto funcionará para la mayoría de las estructuras de datos, y también para los booleanos. – Sean

Cuestiones relacionadas