Domanda

Ho un progetto DJ1 pro1 con diverse app: app1, app2, app3 e così via. Voglio mostrare alcuni modelli di livello superiore che contengono blocchi da ogni singola 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]

Tutti i modelli di app sono dinamici e utilizzano DB. Come farlo nel modo più corretto ed elegante? O forse la domanda è: come collegare 4 diverse visualizzazioni a un URL?

È stato utile?

Soluzione

Abbiamo avuto un problema simile a questo e la chiave è ottenere i dati corretti nel contesto. Ciò che abbiamo fatto è stato suddividere la creazione dei dati / il riempimento del contesto per ciascuna vista in una routine di creazione del contesto separata. Le viste originali chiamano semplicemente la loro rispettiva routine e quindi rendono il loro modello. La vista composita chiama ciascuno dei costruttori di contesto e quindi esegue il rendering del modello principale, che include quindi i modelli secondari.

Qui abbiamo riscontrato un piccolo problema con il sistema di template di Django. Stavamo memorizzando nella cache frammenti di template e alcuni di questi frammenti hanno preso dati che erano molto costosi da generare. Se il frammento non era stantio, non volevamo assolutamente fare il lavoro. Ma ritardare il lavoro fino a quando sapevamo di averne bisogno significava che ora eravamo nel modello e:

  • Non è possibile passare parametri ai metodi all'interno di un modello.
  • Il metodo django.template .__ init __. Variable._resolve_lookup () è stato violato in quanto se si passasse un callable, non lo chiamerebbe! Se fai riferimento a un metodo di un oggetto nel contesto, funziona perfettamente.

Il motivo per cui è necessario il funzionamento dei callable è che consente di passare una funzione al curry, ovvero una funzione che ha già alcuni (o tutti) i suoi parametri specificati, ma che non è ancora stato chiamato. Quindi la vista (o il contesto creato nel caso) dovrebbe essere in grado di eseguire il curry di una funzione completamente specificata (ricorda, non puoi passare parametri nei modelli stessi) in modo che il modello quando necessario a potrebbe invocare il callable, ottenere i dati e andiamo via.

Abbiamo adottato due approcci separati per questo:

Da quando abbiamo creato questo sito ho imparato che avremmo potuto risolverlo utilizzando i generatori come produttori di dati ritardati. I generatori si comportano in qualche modo come una funzione curry (in quanto è possibile passare parametri arbitrari per l'installazione), ma il motore del modello li vede come un altro iteratore. C'è un ottimo tutorial su questo argomento. Nota: i generatori non sono array e puoi consumarli solo una volta, quindi potrebbe essere necessario modificare alcune delle tue logiche.

La prossima volta penso che andremo semplicemente con modelli jinja2 e smetteremo di rovinare con i modelli di Django .

Altri suggerimenti

Puoi utilizzare un {% include%} tag. Ma non ti aiuta molto. La soluzione migliore è di scrivere tag di inclusione con modello e funzionalità necessari.

Non puoi (in modo semplice) mescolare più viste in una. Prova tag la sua bella soluzione django.

L'ho fatto scrivendo tag modello personalizzati per ogni applicazione che volevo includere. Inizialmente i miei tag template sono appena passati a HTML codificato. Successivamente ho scoperto che i tag potevano caricare i propri frammenti di modello. C'era anche un frammento da qualche parte che era un tag di contenuto generico più recente che ha funzionato abbastanza bene.

Molte app riutilizzabili (in particolare quelle selezionate nel progetto Pinax ) sono ottimi esempi su come utilizzare la personalizzazione tag modello per inserire contenuti. Anche le talk di James Bennett in DjangoCon 2008 possono aiutare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top