3 votes

Comment transmettre des variables à la page de connexion dans Django 1?

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?

8voto

Akseli Palén Points 7697

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:

Et le ticket de fonctionnalité original:

2voto

Yuji 'Tomita' Tomita Points 46106

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.

2voto

James Points 1006

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
)

0voto

Ryan Allen Points 361

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)

0voto

Fat Fish Points 129

Vous pouvez ajouter votre attribut personnalisé à la request qui est disponible dans le modèle, c'est-à-dire :

request.my_params = {
    'my_param1':'my_param1',
    'my_param2':'my_param2',
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X