Django:通过url的GET设置上下文

时间:2010-01-05 00:31:15

标签: django django-context

如何根据base.html的网址制作具体行动?

我在base.html中有两个if -clauses作为上下文语句。如果GET中有代数,则应显示给定的上下文。

我的url.conf

from django.conf.urls.defaults import *

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

)

我的base.html使用伪代码

<!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 %}

2 个答案:

答案 0 :(得分:2)

您没有显示视图功能,但这是一个简单的结构:

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)

(我可能会有一些错别字,但它不在我的脑海中。)

答案 1 :(得分:1)

Ned基于变量值的方法的替代方法是使用两个不同的模板来扩展公共基本模板。 E.g。

在templates / base.html中:

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

然后让你的代数视图使用templates / algebra.html:

{% extends "base.html" %}

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

math或其他任何事情做类似的事情。每种方法都有优点和缺点。选择一个最适合您问题的那个。

更新:您将"algebra.html"作为第一个参数传递给render_to_response()。它扩展 "base.html",因为它使用之外的所有它明确替换的块。有关其工作原理的说明,请参阅Template Inheritance。模板继承是非常强大的概念,用于在大量不同的页面上实现一致的外观,但共享部分或全部菜单等。你可以进行多级模板继承,这对于管理具有与“主要外观”有显着差异但又希望尽可能多地共享HTML / CSS的子部分的网站非常有用。

这是模板世界DRY (Don't Repeat Yourself)中的一个关键原则。