Джанго URL-адреса прямо в HTML-шаблон - PullRequest
32 голосов
/ 04 августа 2010

Изучение Джанго и Питона.

Просто создайте новый сайт после прохождения урока. Теперь ради аргументов скажу, что я хочу добавить кучу базовых html-страниц «О нас» и «Часто задаваемые вопросы» с очень ограниченными динамическими элементами. Можете ли вы написать новую строку в моем файле urls.py для каждой страницы? или это какой-то изящный способ сказать, что все * * .html сопоставляются с соответствующим файлом .html?

В целом, даже если для этого требуется представление, придется ли мне писать новую строку в файле url.py для каждой страницы?

Ответы [ 5 ]

25 голосов
/ 04 августа 2010

Пока в 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.

15 голосов
/ 19 марта 2015

В настоящее время лучший способ сделать это - использовать TemplateView из общих представлений на основе классов:

from django.views.generic.base import TemplateView

url(r'^$', TemplateView.as_view(template_name='index.html'), name='home'),
12 голосов
/ 04 августа 2010

Напишите 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, потому что он будет обрабатывать шаблоны, которые не существуют, как 404, тогда как .+\.htmlвзорвется с 500 ошибками, если шаблон не существует.

10 голосов
/ 03 февраля 2013

Если вы используете классовые представления , поскольку 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()),
    # ...
)
1 голос
/ 04 августа 2010

Один из способов сделать это - написать одно пользовательское представление, которое обернет универсальное представление 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

Тем не менее, я подозреваю, что существуют лучшие решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...