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?

Foi útil?

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

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top