opções Django para fazer variáveis ??amplamente disponíveis
Pergunta
Toda vez que eu abrir uma página que eu quero para obter o ID de projeto atualmente ativo. Isto será feito por chacking o subdomínio e verificar o usuário conectado no momento pode vê-lo.
Uma vez que eu alcanço meu ponto de vista eu quero ser capaz de fazer
tasks = Task.objects.filter(project = current_project)
Onde current_project (ou CURRENT_PROJECT ou current_project ???) já foi configurado.
Alguém pode explicar os prós / contras das várias abordagens que tenho encontrado nos docs e me colocou no caminho certo?
- Sessões
- Middleware
- Enfiar
- builtins
Este foi como eu fiz isso no final:
Decorator:
def check4project(fn):
current_project = 'fred'
def check(*args, **kw):
kw['project']=current_project
return fn(*args, **kw)
return check
Veja o exemplo
@login_required
@check4project
@tweetpost
def index(request, project=0):
print project
Solução
Tudo depende do que sua semântica de "projeto atual" são. Aqui estão algumas possibilidades:
-
Poderia ser uma característica do usuário: ele visita sua página de perfil e define um projeto atual. Este seria armazenado no banco de dados, e você acessá-lo com o ORM.
-
Poderia ser uma característica do URL, com base exclusivamente no subdomínio. Isso poderia ser feito com middleware, que tem acesso ao pedido, e poderia, por exemplo, analisar o nome do host e definir um atributo personalizado na solicitação que você pode acessar em suas funções view.
-
Semelhante ao # 2, você poderia usar um decorador de visão se verificando projetos é feito para alguns pontos de vista, mas não todos. Isto é semelhante ao decoradores do Django para a verificação de autorização.
-
Poderia ser uma característica da visita do usuário ao site: ele visita uma página de projetos, escolhe um para trabalhar, e é pegajoso até que ele escolhe um outro projeto. Isso seria melhor armazenado na sessão, que é especificamente para este tipo de armazenamento temporário.
De sua descrição, ele sounsd como # 2 ou # 3 é o melhor para você, dependendo de como suas opiniões dividem-se entre cuidar cerca de subprojetos e não.
Outras dicas
Você poderia fazer um context_processor e, em seguida, obter o seu valor a partir do objeto de solicitação.
Você considerou um custom tag ?