Sempre incluindo o usuário no contexto do template Django
-
09-06-2019 - |
Pergunta
Estou trabalhando em um pequeno site de intranet para uma pequena empresa, onde o usuário deve poder postar.Eu imaginei um mecanismo de autenticação muito simples onde as pessoas apenas digitam seu endereço de e-mail e recebem uma URL de login exclusiva, que define um cookie que sempre as identificará para solicitações futuras.
Na configuração do meu modelo, tenho base.html e as outras páginas estendem isso.Quero mostrar o botão de login ou cadastro no base.html, mas como posso garantir que as variáveis necessárias sempre façam parte do contexto?Parece que cada visualização apenas configura o contexto como deseja e não existe uma população de contexto global.Existe uma maneira de fazer isso sem incluir o usuário em cada criação de contexto?
Ou terei que criar meus próprios atalhos personalizados para configurar o contexto corretamente?
Solução
Em um sentido mais geral de não ter que definir variáveis explicitamente em cada visualização, parece que você deseja escrever suas próprias processador de contexto.
Dos documentos:
Um processador de contexto possui uma interface muito simples:É apenas uma função Python que recebe um argumento, um objeto HttpRequest, e retorna um dicionário que é adicionado ao contexto do modelo.Cada processador de contexto deve retornar um dicionário.
Outras dicas
Há não há necessidade para escrever um processador de contexto para o objeto de usuário se você já tiver o "django.core.context_processors.auth"
em TEMPLATE_CONTEXT_PROCESSORS
e se você estiver usando RequestContext
em suas opiniões.
se você estiver usando Django 1.4 ou mais recente, o módulo foi movido para django.contrib.auth.context_processors.auth
@Ryan:A documentação sobre pré-processadores é um pouco pequena
@Staale:Adicionando usuário ao contexto toda vez que alguém chama o modelo em exibição, DRY
A solução é usar um pré-processador
A:Nas suas configurações adicione
TEMPLATE_CONTEXT_PROCESSORS = (
'myapp.processor_file_name.user',
)
B:Em myapp/processor_file_name.py insira
def user(request):
if hasattr(request, 'user'):
return {'user':request.user }
return {}
A partir de agora você poderá usar funcionalidades de objetos de usuário em seus modelos.
{{ user.get_full_name }}
As dicas estão em todas as respostas, mas mais uma vez, do "zero", para iniciantes:
os dados de autenticação estão em modelos (quase) por padrão - com um pequeno truque:
em views.py
:
from django.template import RequestContext
...
def index(request):
return render_to_response('index.html',
{'var': 'value'},
context_instance=RequestContext(request))
em index.html
:
...
Hi, {{ user.username }}
var: {{ value }}
...
Daqui: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates
Esta variável de contexto do modelo não estará disponível se um SolicitarContexto não está sendo usado.
@Dave para usar {{user.username}} Nos meus modelos, terei que usar o requestcontext em vez de apenas um mapa/hash normal: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
Então, acho que não há globais que o mecanismo de modelo verifique.
Mas o RequestContext tem algumas classes pré-preenchidas que posso analisar para resolver meus problemas.Obrigado.
Se você puder conectar sua autenticação ao Esquema de autenticação Django você poderá usar request.user
.
Eu acho que isso deveria ser apenas um caso de ligar authenticate()
e login()
com base no conteúdo do seu cookie.
Editar:@Staale - eu sempre uso o locals()
truque para o meu contexto para que todos os meus modelos possam ver request
e assim request.user
.Se não estiver, acho que não seria tão simples.
é possível por padrão, seguindo os passos a seguir, certifique-se de ter adicionado o contexto 'django.contrib.auth.context_processors.auth' em suas configurações.Por padrão, é adicionado em settings.py, então fica assim
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)
E você pode acessar o objeto do usuário assim,
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
Para mais informações, consulte aqui http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates