Sempre incluindo o usuário no contexto do template django

votos
27

Eu estou trabalhando em um pequeno site da intranet para uma pequena empresa, onde o usuário deve ser capaz de enviar mensagens. I ter imaginado um mecanismo de autenticação muito simples onde as pessoas simplesmente inserir seu endereço de e-mail, e é enviado um URL de login único, que define um cookie que sempre identificá-los para futuras solicitações.

Na minha configuração modelo, eu tenho base.html, e as outras páginas estender este. Quero mostrar logado ou botão registrar no base.html, mas como posso garantir que as variáveis ​​necessárias são sempre uma parte do contexto? Parece que cada vista apenas configura o contexto como eles gostam, e não há nenhuma população contexto global. Existe uma maneira de fazer isso sem incluir o usuário em cada criação contexto?

Ou será que eu tenho que fazer meus próprios atalhos personalizados para configurar o contexto corretamente?

Publicado 03/09/2008 em 13:22
fonte usuário
Em outras línguas...                            


7 respostas

votos
43

nenhuma necessidade para escrever um processador de contexto para o objeto de usuário, se você já tem o "django.core.context_processors.auth"em e se você estiver usando em seus pontos de vista.TEMPLATE_CONTEXT_PROCESSORS RequestContext

se você estiver usando o Django 1.4 ou mais recente do módulo foi movido para django.contrib.auth.context_processors.auth

Respondeu 30/06/2009 em 17:14
fonte usuário

votos
33

@ Ryan: Documentação sobre preprocessors é um pouco pequeno

@Staale: Adicionando usuário ao contexto cada vez que um está chamando o modelo em vista, DRY

Solução é usar um pré-processador

A : Em suas configurações de adicionar

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

B : Na novaaplicacao / inserção processor_file_name.py

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

A partir de agora você é capaz de usar funcionalidades objeto de usuário em seus modelos.

` user`.`get_full_name `
Respondeu 06/11/2008 em 17:05
fonte usuário

votos
18

Em um sentido mais geral de não ter que definir explicitamente variáveis em cada vista, parece que você quer olhar para escrever o seu próprio processador de contexto .

De docs:

Um processador de contexto tem uma interface muito simples: É apenas uma função Python que tem um argumento, um objeto HttpRequest, e retorna um dicionário que é adicionado ao contexto do template. Cada processador contexto deve retornar um dicionário.

Respondeu 03/09/2008 em 13:31
fonte usuário

votos
3

As sugestões estão em cada resposta, mas mais uma vez, de "scratch", para iniciantes:

dados de autenticação está 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 `
... 

A partir daqui: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

Esta variável de contexto modelo não está disponível se um RequestContext não está sendo usado.

Respondeu 09/08/2012 em 08:28
fonte usuário

votos
2

@ Dave Para usar `user`.`username` nos meus modelos, então vou ter que usar RequestContext ao invés de apenas um mapa normal / de hash: http://www.djangoproject.com/documentation/templates_python/#subclassing-context- RequestContext

Então eu acho que não há globals que os controlos do motor modelo.

Mas o RequestContext tem algumas classes preencher previamente que eu possa olhar para resolver meus problemas. Obrigado.

Respondeu 03/09/2008 em 13:33
fonte usuário

votos
2

Se você pode conectar sua autenticação para o esquema de autenticação Django você vai ser capaz de usar request.user.

Eu acho que isso deve ser apenas um caso de chamar authenticate()e login()com base no conteúdo do seu Cookie.

Edit: @Staale - Eu sempre uso o locals()truque para o meu contexto assim todos os meus modelos podem ver requeste assim request.user. Se você não for, então eu acho que não seria tão simples.

Respondeu 03/09/2008 em 13:28
fonte usuário

votos
1

sua possível por padrão, fazendo os seguintes passos, certifique-se de ter adicionado o contexto 'django.contrib.auth.context_processors.auth' em suas configurações. Por padrão sua adicionados em settings.py, por isso sua aparência como este

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

E você pode acessar objeto de usuário como esta,

{% 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

Respondeu 27/01/2011 em 12:15
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more