Pergunta

Eu tenho um Pro1 projeto Django com várias aplicações: app1, app2, app3 e assim por diante. Eu quero mostrar alguns modelo de nível superior que contém blocos de cada app:

example_base_template.html:

[header /]
[left nav bar]{{ app1 rendered template }}[/left nav bar]
[right nav bar]{{ app2 rendered template }}[/right nav bar]
[center section]{{ app1 main functionality template }}[/center section]
[footer]{{ app3 rendered template }}{{ app4 rendered template }}[/footer]

Todos esses modelos de aplicativos são dinâmicas, que o uso DB. Como fazer isso da forma mais adequada e elegante? Ou talvez a pergunta é como conectar 4 visualizações diferentes para um URL?

Foi útil?

Solução

Nós tivemos um problema semelhante a este ea chave está recebendo os dados corretos para o contexto. O que fizemos foi fuga do recheio criação de dados / Contexto para cada vista em uma rotina build-a ao contexto separado. Os pontos de vista originais apenas chamar a respectiva rotina e, em seguida, tornar o seu modelo. A vista compósito chama cada um dos contexto-builders e, em seguida, torna o modelo mestre, que, em seguida, inclui os sub-modelos.

Este é o lugar onde nós funcionamos em um pouco de um problema com o sistema de templates do Django. Fomos cache fragmentos de modelo e alguns desses fragmentos levou dados que era muito caro para gerar. Se o fragmento não foi envelhecer, nós definitivamente não queria fazer o trabalho. Mas atrasar o trabalho até que sabíamos que precisávamos significava que estavam agora no modelo e:

  • Você não pode passar parâmetros para métodos de dentro de um modelo.
  • O django.template .__ o init __. Variable._resolve_lookup () método foi quebrado em que se aprovou uma exigível, não chamaria isso! Se você faz referência a um método de um objeto no contexto, que funciona muito bem.

A razão para a necessidade chamáveis ??ao trabalho é que ele permite que você passe em uma função curry - ou seja, uma função que já tem alguns (ou todos) dos seus parâmetros especificados, mas , que ainda não foi chamado. para que a vista (ou a construção de contexto, no caso) deve ser capaz de caril uma função full-especificado (lembre-se, você não pode passar parâmetros nos modelos eles mesmos), de modo que o modelo quando necessário a poderia invocar o que pode ser chamado, obter os dados, e vamos embora.

Nós levou duas abordagens separadas para isso:

Uma vez que nós fizemos neste site eu aprendi que poderia ter sido capaz de resolvê-lo usando geradores como produtores de dados atrasados. Os geradores de agir como uma espécie de função de curry (em que você pode passar parâmetros arbitrários para a configuração), mas o modelo de motor vê como apenas mais um iterador. Há um grande tutorial sobre o assunto. Nota: Os geradores não são matrizes e você só pode consumi-los uma vez, de modo algum da sua lógica pode precisar de ser ajustado

.

Da próxima vez eu acho que nós vamos com Jinja2 modelos e parada enroscando com modelos do Django .

Outras dicas

Você pode usar um {% include%} tag. Mas isso não ajudá-lo muito. A melhor solução é escrever costume tag inclusão com modelo necessária e funcionalidade.

Você não pode (em simples forma) misturar vários pontos de vista em um. Tente marcas sua solução bastante Django.

Eu fiz isso por escrito marcas de modelo personalizado para cada aplicação que eu queria incluir. No começo minhas marcas de modelo apenas passado de volta codificado html. Mais tarde eu descobri que as marcas poderiam carregar seus próprios fragmentos de modelo. Houve também um lugar trecho que foi um genérico mais recente tag de conteúdo que funcionou muito bem.

Muitos aplicativos reutilizáveis ??(esp. Aqueles que foram selecionados para a href="http://pinaxproject.com/" rel="nofollow noreferrer"> Pinax projeto ) servem como grandes exemplos de como usar personalizado template tags para inserir conteúdo. James Bennett falar em DjangoCon 2008 podem também ajuda.

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