Динамические 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