J'ai remplacé la page de connexion de l'administration django et j'aimerais transmettre certaines variables à la page de connexion. Comment puis-je faire cela?
Réponses
Trop de publicités?Une solution consiste à utiliser le paramètre extra_context (Django 1.3 et plus récent).
from django.contrib.auth.views import login
...
return login(request, template_name, extra_context={
'template_variable':value
})
Voir ces questions et réponses similaires:
- Ajouter un extra_context dans la vue intégrée de déconnexion Django
- passer des arguments supplémentaires au modèle de connexion et de template de Django
Et le ticket de fonctionnalité original:
Mise à jour : laissez-moi préciser que je pense personnellement que vous devriez écrire votre propre vue de connexion si vous voulez influencer le contexte, notamment parce que c'est si simple (vous pouvez copier et coller les ~20 lignes dans votre propre vue).
Étant donné que ce que j'aime faire sur stackoverflow est de trouver de toute façon un moyen de contourner, voici une alternative astucieuse :
Si vous voulez utiliser la page d'administration intégrée, la seule méthode que je vois est d'attacher des propriétés à AuthenticationForm
.
Voici django.contrib.auth.views.login
:
def login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm):
....
return render_to_response(template_name, {
'form': form,
redirect_field_name: redirect_to,
'site': current_site,
'site_name': current_site.name,
}, context_instance=RequestContext(request))
Le seul endroit où nous pouvons 's'accrocher' au modèle de connexion sans affecter rien d'autre est à travers AuthenticationForm
.
from django.contrib.auth.forms import AuthenticationForm
AuthenticationForm.foobar = 'Bonjour'
...
(r'^accounts/login/$', 'django.contrib.auth.views.login', \
{'authentication_form':AuthenticationForm),
# template
{{ form.foobar }}
Une autre alternative est d'utiliser un context processor, qui injecte des variables dans chaque vue utilisant RequestContext
. Utilisez ceci si votre variable est utile dans d'autres modèles également.
Pour plus de clarté (j'ai commenté la réponse d'Akseli), une autre solution consiste à transmettre les variables de modèle supplémentaires directement depuis url.conf
via la clé extra_context
:
# url.conf -- cet exemple provient de versions plus anciennes de django, consultez la documentation
from django.contrib.auth.views import login
urlpatterns = patterns('',
url(
r'^accounts/login/$',
login,
{
'template_name': 'login.html',
'extra_context': {
# Vos variables supplémentaires ici en tant que paires clés-valeurs.
'title': 'Ma Page | Connexion'
}
},
name='login'
),
... # autres patterns
)
Comme l'a dit Akseli, utilisez extra_context, mais passez le contexte supplémentaire en tant que partie du contexte :
def login(...):
...
some_var = some_var.objects.all()
extra_context = {'some_var': some_var,}
if extra_context is not None:
context.update(extra_context)
return TemplateResponse(request, template_name, context, current_app=current_app)