2010-01-05 6 views
0

Comment faire une action spécifique basée sur l'URL de base.html?Django: Paramétrage du contexte par le GET de l'url

J'ai deux if-clauses comme instructions de contexte dans base.html. S'il y a de l'algèbre dans le GET, alors le contexte donné devrait être montré.

Mon url.conf

from django.conf.urls.defaults import * 

urlpatterns = patterns('', 
    (r'^algebra/$', 'algebra'), 
    (r'^mathematics/$', 'mathematics'), 

) 

Mon base.html en pseudo-code

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<html lang="en"> 
    <body> 
       {% if algebra %}          
        <div>... -- do this -- </div> 
       {% endif %} 

       {% if math %} 
        <div>... -- do this -- </div> 
       {% endif %} 

Répondre

1

Une alternative à la méthode basée sur des valeurs variables de Ned consiste à utiliser deux modèles différents qui étendent un modèle de base commun. Par exemple.

Dans les modèles/base.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<html lang="en"> 
    <body> 
     {% block main_body %}          
     {% endblock main_body %}          
     etc., etc. 

Testez ensuite votre point de vue algèbre utiliser des modèles/algebra.html:

{% extends "base.html" %} 

{% block main_body %} 
    do algebra stuff here 
{% end block main_body %} 

et faire quelque chose de similaire pour math ou autre. Chaque approche a des avantages et des inconvénients. Choisissez celui qui correspond le mieux à votre problème.

Mise à jour: Vous transmettez le "algebra.html" comme premier argument à render_to_response(). Il étend"base.html" en ce qu'il utilise tout sauf pour le ou les blocs qu'il remplace explicitement. Voir Template Inheritance pour une explication de comment cela fonctionne. L'héritage de modèle est un très concept puissant pour atteindre un aspect cohérent à travers un grand nombre de pages qui diffèrent dans leur corps, mais partagent certains ou tous les menus, etc Et vous pouvez faire l'héritage de modèle multi-niveau ce qui est extrêmement agréable pour la gestion des sites qui ont des sous-sections qui ont des différences significatives avec le "look principal" et qui pourtant veulent partager autant de HTML/CSS que possible.

Ceci est un principe clé dans DRY (Don't Repeat Yourself) dans le monde modèle.

+0

Quelle est votre opinion -method? Est-ce 'def common_view (request): ctx = Context(); return_to_response ("base.html", ctx) '? –

2

Vous ne montrez pas vos fonctions de vue, mais voici une structure simple:

def algebra(request): 
    return common_view(request, algebra=True) 

def math(request): 
    return common_view(request, math=True) 

def common_view(request, math=False, algebra=False): 
    ctx = Context() 
    ctx['algebra'] = algebra 
    ctx['math'] = math 
    # blah blah, all the other stuff you need in the view... 
    return render_to_response("base.html", ctx) 

(Je pourrais avoir quelques fautes de frappe, c'est sur le dessus de ma tête).