Django динамические URL - PullRequest
       7

Django динамические URL

13 голосов
/ 25 февраля 2012

Я разрабатываю веб-сайт, используя Django в качестве бэкэнда, и я хочу позволить клиенту добавлять новые страницы с помощью интерфейса администратора - поэтому он вводит заголовок страницы, псевдоним страницы, который используется для более хороших URL-адресов, и выбирает, следует лиему нужен статический контент или структура на основе статьи.

Мой подход заключается в следующем: я создал приложение под названием sitemanager, которое состоит из описанной выше модели страниц и контекстного процессора, который добавляет страницы кконтекст моих шаблонов (для меню и т. д.), и это прекрасно работает.

Конечно, мне также нужно подключить его к моему url-файлу, но здесь начинается проблема: я могу, благодаряПитоническая структура Django, извлекает модель Page в пределах urls.py, и соответственно генерирует мой шаблон URL, и он показывает, но Django, похоже, кэширует этот файл (что обычно имеет смысл), поэтому изменения будут иметь место только послеперезапуск сервера.Это, очевидно, неприемлемо.

Моей первой идеей было бы как-то привести приложение администратора к сбросу кеша URL, если новые страницы добавляются, удаляются или изменяются псевдонимы (и только тогда, потому что кеширование обычно являетсяхорошая вещь), но я не знаю, с чего начать.

Или, может быть, есть и более простое решение, которого я сейчас не вижу?

Соответствующая часть моего urls.py выглядит в основном так:

from sitemanager.models import Page
static_pages = Page.objects.filter(static=True)
article_pages = Page.objects.filter(static=False)
for page in static_pages:
    pattern = r'^/'+page.alias+'/$'
    urlpatterns += patterns('',
        url(pattern, 'views.static_page',
            { 'active': page }
        )
    )
# Pretty much the same for the article pages,
# but with includes of another app

Надеюсь, я не допустил слишком много ошибок, разбрасывая этот код в моей голове!

Ответы [ 2 ]

15 голосов
/ 25 февраля 2012

Вы можете использовать именованные группы в URL для передачи данных в представления, и для них не требуется динамическое обновление в URL. Именованная часть, содержащая page.alias, будет просто передана в качестве ключевого аргумента вашей функции просмотра. Вы можете использовать его, чтобы получить реальный объект Page.

# urls.py
urlpatterns += patterns('',
   (r'^(?P<page_alias>.+?)/$', 'views.static_page'),
)

# views.py
def static_page(request, page_alias):    # page_alias holds the part of the url
    try:
        active = Page.objects.get(page_alias=page_alias)
    except Page.DoesNotExist:
        raise Http404("Page does not exist")
2 голосов
/ 25 февраля 2012

Вам не нужен конкретный URL для каждого элемента во всей вашей базе данных.

Не видя вашего представления, я думаю, вы можете выбрать один URL или несколько URL.

Как пример:

#urls.py
urlpatterns = patterns('yourapp.views',
url(r'^static_pages/(?P<static_pages_id>\d+)/(?P<True_or_False>\D+)$', your_view_here, name='your_name_here'),
)

#views.py
def your_view_here(request, static_pages_id, True_or_False):
    obj = get_object_or_404(Page, pk=static_pages_id)
    if True_or_False:
        #do something when True
...