Django ссылается прямо на шаблон html
Изучение django и python.
Просто настройте новый сайт после выполнения учебника. Теперь для аргументов ради скажу, что я хочу добавить кучу "О нас", часто задаваемые основные страницы html с очень ограниченными динамическими элементами, и продолжайте писать новую строку в моем файле urls.py для каждой страницы? или их некоторая опрятная возможность сказать, что все файлы * *.html переданы в соответствующий .html файл напрямую?
В общем, даже если для этого требуется представление, мне нужно написать новую строку в файле url.py для каждой страницы?
Ответы
Ответ 1
Пока в URL-адресе есть какой-то уникальный идентификационный раздел, вам не нужно будет создавать запись в urls.py для каждого URL-адреса прямого шаблона.
Например, вы можете сказать, что все URL-адреса, заканчивающиеся на ".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.
Ответ 2
Напишите URL-адрес, который захватывает интересующие вас статические страницы.
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
, потому что он будет обрабатывать шаблоны, которые не существуют как 404s, тогда как .+\.html
взорвет 500 ошибок, если шаблон не существует.
Ответ 3
В настоящее время лучший способ сделать это - использовать TemplateView из общих представлений на основе классов:
from django.views.generic.base import TemplateView
url(r'^$', TemplateView.as_view(template_name='index.html'), name='home'),
Ответ 4
Если вы используете представления на основе класса, поскольку direct_to_template
был устарел, вы можете создать простую оболочку, которая напрямую отображает ваши собственные шаблоны:
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()),
# ...
)
Ответ 5
Один из способов сделать это - написать одно настраиваемое представление, которое обертывает общий вид 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
Тем не менее, я подозреваю, что есть лучшие решения.