2013-06-27 2 views
4

Nous avons eu ce code et cela a bien fonctionné. Après avoir fait un refactor, ça ne marche plus. Comme le dit le commentaire, nous voulons seulement hériter d'une page de base si la requête n'est pas une requête ajax. Pour ce faire, nous passons un paramètre au template, et, en fonction du paramètre, nous héritons ou non.Mako Dynamic Template Inheritance

View.py

class Router(object): 
    def __init__(self, request): 
     self.request = request 

    @view_config(route_name="home") 
    def get(self): 
     template = "home.mak" 
     value = {'isPage':self.request.is_xhr is False} 
     return render_to_response(template, value, request=self.request) 

Template.mak

##conditional to determine with the template should inherit from the base page 
##it shouldn't inherit from the base page is it is being inserted into the page using ajax 
<%! 

    def inherit(context): 
     if context.get('isPage') == True: 
      return "base.mak" 
     else: 
      return None 
%> 
<%inherit file="${inherit(context)}"/> 

Actuellement, l'erreur est non définie ne pas attribut __ __ getitem. Si nous changeons $ {inherit (context)} en $ {inherit (value)}, nous obtenons que la valeur globale de la variable est indéfinie.

+1

Pouvez-vous essayer de mettre toute la logique dans le Hériter marque? Juste pour sortir l'appel de la fonction de l'équation: $ {'base.mak' si context.get ('isPage') else None} –

+0

Je ne pense pas que c'était le problème. Nous avons fait un refactor assez important et le code ci-dessus fonctionne à nouveau. Je suppose que le contexte passé n'a pas été initialisé ou qu'il y avait une erreur de syntaxe dans l'un des modèles. – JeffRegan

+0

En outre, l'objet de requête a une propriété appelée is_xhr qui est vraie si la requête est asynchrone. Nous utilisons cette propriété pour déterminer si nous devons charger la page entière ou non. Donc is_page = self.request.is_xhr est faux – JeffRegan

Répondre

1

Juste couru dans le même problème, même cas d'utilisation aussi bien (disposition de rendu ou non selon la demande étant un XHR).

Vous pouvez apparemment accéder au request par context, de sorte que vous pouvez éviter d'avoir à partager ce petit peu de logique sur deux endroits (voir et modèle):

<%! 
    def inherit(context): 
     if not context.get('request').is_xhr: 
      return 'layout_reports.mako' 
     else: 
      return None 
%> 
<%inherit file="${inherit(context)}"/> 
-1

Je ne sais pas si cela fonctionne ou non

%if not request.is_xhr: 
<inherit file='base.mako'/> 
%endif 

demande est disponible aEn tenant pour acquis dans le contexte

+0

Cela ne fonctionne pas. L'héritage ne peut pas être décidé pendant le rendu du modèle. Il doit être déclaré dans un bloc de niveau module, sinon la commande est ignorée. http://docs.makotemplates.org/en/latest/syntax.html#module-level-blocks Aussi, je ne pense pas que la requête soit transmise au template, donc cela va générer une exception. – JeffRegan

+0

Je me suis trompé sur la demande d'être passé au modèle. – JeffRegan

0

Nous avons fait une refactor assez importante et le code ci-dessus fonctionne à nouveau. Je suppose que le contexte passé n'a pas été initialisé ou qu'il y avait une erreur de syntaxe dans l'un des modèles. En outre, l'objet de requête a une propriété appelée is_xhr qui est vraie si la requête est asynchrone. Nous utilisons cette propriété pour déterminer si nous devons charger la page entière ou non. Donc is_page = self.request.is_xhr est False