2012-06-29 19 views
9

Ho esperienza con .NET MVC e voglio imparare un framework Python. Ho scelto Pyramid.Framework piramidale e modelli master/pagina master/viste parziali

.NET MVC ha il concetto di un maestro pagina, vista e vista parziale. Una pagina master sarebbe simile:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
</head> 
<body> 
    <div> 
     <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
    </div> 
</body> 
</html> 

posso quindi creare una vista che riempire lo spazio identificato da MainContent nella pagina master.

Passando attraverso la Piramide wiki esercitazione here, vedo l'autore ha ripetuto gran parte lo stesso contenuto in ciascuno dei suoi modelli - contenuti che normalmente sarebbe definito in una pagina master - e totalmente violati DRY.

Esiste un concetto di una pagina master in Pyramid?

+1

Oltre a @ di SeanViera risposta, uno sguardo a questa risposta: http://stackoverflow.com/a/11025111/320021 - per un esempio di come si può passare un modello principale a una vista con Chameleon. – Sergey

+0

Esistono due principali metodi di riutilizzo del codice implementati dalla maggior parte dei moderni motori di template: * un modello può includere altri modelli o frammenti di modelli * un modello può ereditare da un altro modello per modificare o estendere il modello principale –

risposta

15

Proprio come MVC.NET Pyramid può utilizzare qualsiasi numero di linguaggi di template e quasi tutti supportano concetti simili alle pagine master. Nessuno di loro chiamata loro che se ;-)

Chameleon è probabilmente il più lontano là fuori - gli strumenti utilizzati per definire le aree in pagine master ContentPlaceholder, etc.) sono chiamati macros in Chameleon e indicati con l'acronimo piuttosto pesante METAL (Macro Expansion Template Attribute Language).

In Jinja2 e Mako sono chiamati blocks e Breve li chiama slots.

Ecco ciò che una pagina master potrebbe apparire come in ciascuna di esse:

Chameleon:

<!-- Caveat Emptor - I have never used Chameleon in anger --> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:tal="http://xml.zope.org/namespaces/tal" 
    xmlns:metal="http://xml.zope.org/namespaces/metal" 
    xmlns:i18n="http://xml.zope.org/namespaces/i18n"> 
<!-- We don't *need* all of this in Chameleon, but it's worth 
remembering that it adds it for us --> 
<head> 
<title metal:define-macro="title"><span metal:define-slot="title"></span></title> 
</head> 
<body metal:define-macro="content"> 
<div metal:define-slot="content"></div> 
</body> 
</html> 

Jinja2:

<!DOCTYPE html> 
<html> 
<head> 
<title>{% block title %}{% endblock %}</title> 
</head> 
<body> 
{% block content %}{% endblock %} 
</body> 
</html> 

Mako:

<!DOCTYPE html> 
<html> 
<head> 
<title><%block name="title" /></title> 
</head> 
<body> 
<%block name="content" /> 
</body> 
</html> 

Breve:

html [ 
    head [ 
     title [ slot("title") ] 
    ] 
    body [ 
     slot("content") 
    ] 
] 
+0

Grazie. Avevo letto di macro, ma per qualche motivo pensavo che fossero usati per qualcos'altro. Li esaminerò ulteriormente. – ken

+4

+ amillion per includere esempi per un sacco di lingue di template lì. :-) –

Problemi correlati