2010-08-04 65 views
27

學習django & python。Django直接轉到html模板

在完成本教程後,只需設置一個新的網站。現在爲了參數的緣故,我想添加一堆關於我們,FAQ基本html頁面的動態元素非常有限,你會繼續在每個頁面的urls.py文件中寫一行嗎?或者他們是否可以直接將所有* * .html映射到相關的.html文件?

一般來說即使它確實需要一個視圖,我也必須在每個頁面的url.py文件中寫一個新行?

回答

25

只要URL中有一些唯一標識部分,就不需要爲每個直接模板url在urls.py中創建一個條目。

例如,您可以說所有以「.html」結尾的網址都是從模板中引用直接文件。

urlpatterns = patterns('django.views.generic.simple', 
    (r'(.+\.html)$', 'direct_to_template'), 
    # ... 
) 

查看http://docs.djangoproject.com/en/1.2/ref/generic-views/#django-views-generic-simple-direct-to-template瞭解詳情。

+3

謝謝,這不正是我所需要的,但是這個竅門。 ('(。+ \。html)$',direct_to_template), – 2010-08-04 22:47:58

+1

Django 1.6:沒有模塊名爲simple – Timo 2014-09-15 06:54:37

1

做到這一點的一種方法是編寫一個包裝了direct_to_template通用視圖的自定義視圖。包裝器可以接受參數並相應地形成模板的名稱並將其傳遞給direct_to_template。這樣,您可以使用單個URL配置路由多個頁面。

事情是這樣的:

url(r'^foo/(?P<page_name>\w+).html$', 'my_static_wrapper', name = 'my_static_wrapper'), 

def my_static_wrapper(request, page_name): 
    # form template name and call direct_to_template 

不過我懷疑有更好的解決方案在那裏,雖然。

12

url(r'^(?P<page_name>about|faq|press|whatever)/$', 'myapp.staticpage', name='static-pages') 

myapp

from django.views.generic.simple import direct_to_template 
from django.http import Http404 

def staticpage(request, page_name): 
    # Use some exception handling, just to be safe 
    try: 
     return direct_to_template(request, '%s.html' % (page_name,)) 
    except TemplateDoesNotExist: 
     raise Http404 

當然staticpage視圖功能,你需要按照你的模板的命名約定其抓住你感興趣的靜態頁面的網址,但是這種模式可以根據需要進行擴展。

這比.+\.html模式更好,因爲它會將不存在的模板視爲404s,而.+\.html如果模板不存在則會爆炸500個錯誤。

10

如果您使用的class based views因爲direct_to_template一直deprecated,您可以創建一個簡單的包裝,直接使自己的模板:

from django.views.generic import TemplateView 
from django.template import TemplateDoesNotExist 
from django.http import Http404 

class StaticView(TemplateView): 
    def get(self, request, page, *args, **kwargs): 
     self.template_name = page 
     response = super(StaticView, self).get(request, *args, **kwargs) 
     try: 
      return response.render() 
     except TemplateDoesNotExist: 
      raise Http404() 

,並在你的路由器:

from myapp.static.views import StaticView 

urlpatterns = patterns('', 
    url(r'^(?P<page>.+\.html)$', StaticView.as_view()), 
    # ... 
) 
+0

需要'from django。HTTP在路由器中導入Http404'('urls.py') – hobs 2014-01-02 19:36:58

+0

很好,是第一個表達「多個字符」的點,第二個點(轉義)是用來分隔文件名和html類型的嗎? – Timo 2014-09-15 08:13:36

+0

@Timo,如果你問網址正則表達式; 。+表示文件slu((不帶文件擴展名)和\ .html強制它必須是URL和文件本身的.html文件。硬編碼。 – kirpit 2014-09-16 15:06:00

12

目前執行此操作的最佳方法是使用基於類的基於視圖的TemplateView:

from django.views.generic.base import TemplateView 

url(r'^$', TemplateView.as_view(template_name='index.html'), name='home'), 
+1

如果您只想將單個頁面直接渲染爲視圖,而無需額外的上下文,則這是實現它的最簡單方法! – Thismatters 2017-11-04 16:10:16