Pergunta

Eu tenho algum código que recebe o atual usuário conectado.

userID = request.session.get("_auth_user_id")
    if userID:
        loggedin_user = User.objects.get(pk=int(userID))
    else:
        loggedin_user = None

Eu quero o nome de usuário para aparecer em cada página.

No momento eu estou colocando o código em todas as vistas e passando o objeto de usuário para cada template

return render_to_response('index.html', {loggedin_user})

Isto parece ir contra D.R.Y do Django ética. Como posso fazer isso com a repetir-me?

EDIT: Talvez usuário era um mau exemplo

.

E se eu queria para obter uma lista de objetos do banco de dados,

items = Item.objects.all()

e lista-los em everypage.

Eu tenho que escrever esse código e passar a lista para o modelo em todas as vistas. Ou eu posso escrever algum código, uma vez que irá fazer essa lista disponível para todos os modelos?

Foi útil?

Solução

Você deve usar um costume tag para algo parecido. Você pode buscar os dados que você precisa no tag personalizado e enviá-lo para o modelo. Tudo que você precisa lembrar é para carregar a tag acima no arquivo de modelo que você está indo para usá-lo em.

Outras dicas

O ID do usuário já existe dentro da sessão. Como tal, você não precisa manter passá-lo ao redor.

{{ request.session._auth_user_id }}

Isso deve funcionar, mas você precisa adicionar isso em suas TEMPLATE_CONTEXT_PROCESSORS em seu arquivo de configuração:

django.core.context_processors.request

Em seu render_to_response, você precisa adicionar o pedido como um parâmetro. Por exemplo:

 return render_to_response('test.html',{}, context_instance=RequestContext(request))

E sobre request.user?

if request.user.is_authenticated():
    name = request.user.username
else:
    name = "Anonymous"

De qualquer forma, se não fosse já está disponível no Django, eu sugiro que você escrever uma classe Middleware como django.contrib.sessions.middleware.SessionMiddleware ou django.contrib.auth.middleware.AuthenticationMiddleware. Que altera classe os detalhes da solicitação antes de serem enviados para uma vista.

Se você precisava lo em uma base per-view, você poderia escrever um decorador para fazer essa pequena pouco, e @Decorator os pontos de vista que você deseja.

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