Question

Je travaille sur un petit site intranet pour une petite entreprise, où l'utilisateur devrait pouvoir publier.J'ai imaginé un mécanisme d'authentification très simple dans lequel les gens entrent simplement leur adresse e-mail et reçoivent une URL de connexion unique, qui définit un cookie qui les identifiera toujours pour les demandes futures.

Dans la configuration de mon modèle, j'ai base.html et les autres pages l'étendent.Je souhaite afficher le bouton de connexion ou d'enregistrement dans le fichier base.html, mais comment puis-je m'assurer que les variables nécessaires font toujours partie du contexte ?Il semble que chaque point de vue définit simplement le contexte comme bon lui semble, et qu'il n'y a pas de population de contexte global.Existe-t-il un moyen de procéder sans inclure l'utilisateur dans chaque création de contexte ?

Ou dois-je créer mes propres raccourcis personnalisés pour configurer correctement le contexte ?

Était-ce utile?

La solution

Dans un sens plus général, comme ne pas avoir à définir explicitement des variables dans chaque vue, il semble que vous souhaitiez envisager d'écrire vos propres variables. processeur de contexte.

À partir des documents :

Un processeur de contexte a une interface très simple :Il s'agit simplement d'une fonction Python qui prend un argument, un objet HttpRequest, et renvoie un dictionnaire qui est ajouté au contexte du modèle.Chaque processeur de contexte doit renvoyer un dictionnaire.

Autres conseils

Il y a pas besoin pour écrire un processeur de contexte pour l'objet utilisateur si vous disposez déjà du "django.core.context_processors.auth" dans TEMPLATE_CONTEXT_PROCESSORS et si vous utilisez RequestContext dans vos opinions.

si vous utilisez Django 1.4 ou la dernière version, le module a été déplacé vers django.contrib.auth.context_processors.auth

@Ryan :La documentation sur les préprocesseurs est un peu petite

@Staale :Ajout d'un utilisateur au contexte à chaque fois que l'on appelle le modèle en vue, DRY

La solution est d'utiliser un préprocesseur

UN:Dans vos paramètres, ajoutez

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user',
)

B:Dans myapp/processor_file_name.py insérer

def user(request):
    if hasattr(request, 'user'):
        return {'user':request.user }
    return {}

Vous pouvez désormais utiliser les fonctionnalités des objets utilisateur dans vos modèles.

{{ user.get_full_name }}

Les indices sont dans chaque réponse, mais encore une fois, à partir de « zéro », pour les débutants :

les données d'authentification sont (presque) par défaut dans les modèles -- avec une petite astuce :

dans views.py:

from django.template import RequestContext
...
def index(request):
    return render_to_response('index.html', 
                              {'var': 'value'},
                              context_instance=RequestContext(request))

dans index.html:

...
Hi, {{ user.username }}
var: {{ value }}
... 

D'ici: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

Cette variable contextuelle de modèle n'est pas disponible si un Contexte de demande n'est pas utilisé.

@Dave pour utiliser {{user.username}} Dans mes modèles, je devrai alors utiliser requestContext plutôt qu'une simple carte / hachage normal: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

Je suppose donc qu'il n'y a pas de variables globales vérifiées par le moteur de modèles.

Mais le RequestContext contient des classes préremplies que je peux examiner pour résoudre mes problèmes.Merci.

Si vous pouvez connecter votre authentification au Schéma d'authentification Django vous pourrez utiliser request.user.

Je pense que cela devrait juste être une affaire d'appel authenticate() et login() en fonction du contenu de votre cookie.

Modifier:@Staale - J'utilise toujours le locals() astuce pour mon contexte afin que tous mes modèles puissent voir request et ainsi request.user.Si ce n’est pas le cas, je suppose que ce ne serait pas si simple.

c'est possible par défaut, en suivant les étapes suivantes, assurez-vous d'avoir ajouté le contexte 'django.contrib.auth.context_processors.auth' dans vos paramètres.Par défaut, il est ajouté dans settings.py, donc cela ressemble à ceci

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)

Et vous pouvez accéder à un objet utilisateur comme celui-ci,

{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}

Pour plus d'informations, référez-vous ici http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top