Динамические URL в Django

я разрабатываю веб - сайт, используя 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 ответов


можно использовать именованные группы в 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")

вам не нужен определенный 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