学习django&蟒。
在完成教程后,只需设置一个新网站即可。现在为了论证,我想添加一堆关于我们,常见问题解答基本的html页面,动态元素非常有限,你是否继续在我的urls.py文件中为每个页面写一个新行?或者是他们用一些简洁的方式将所有* * .html直接映射到相关的.html文件?
一般来说,即使它确实需要视图,我还必须在url.py文件中为每个页面写一个新行吗?
答案 0 :(得分:25)
只要URL中有一些唯一标识部分,您就不需要在urls.py中为每个直接模板网址创建一个条目。
例如,您可以说所有以“.html”结尾的网址都是引用模板中的直接文件。
urlpatterns = patterns('django.views.generic.simple',
(r'(.+\.html)$', 'direct_to_template'),
# ...
)
答案 1 :(得分:15)
目前,最好的方法是使用基于类的通用视图中的TemplateView:
from django.views.generic.base import TemplateView
url(r'^$', TemplateView.as_view(template_name='index.html'), name='home'),
答案 2 :(得分:12)
写一个抓取您感兴趣的静态页面的网址
url(r'^(?P<page_name>about|faq|press|whatever)/$', 'myapp.staticpage', name='static-pages')
staticpage
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
当然,您需要遵循模板的命名约定,但可以根据需要扩展此模式。
这比.+\.html
模式更好,因为它会将不存在的模板视为404,而.+\.html
如果模板不存在则会导致500错误。
答案 3 :(得分: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()),
# ...
)
答案 4 :(得分: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
那说我怀疑那里有更好的解决方案。