Django动态网址

nij*_*sen 13 python django django-urls

我正在开发一个使用Django作为后端的网站,我想让客户使用管理界面添加新页面 - 所以他输入了一个页面标题,一个用于更好网址的页面别名,并选择他是否想要静态内容或基于文章的结构.

我的方法如下:我创建了一个名为app的应用程序sitemanager,它包含上面描述的页面模型,以及一个上下文处理器,它将页面添加到我的模板上下文中(用于菜单等),这样可以正常工作.

当然,我还需要将它挂钩到我的url文件中,但这里是麻烦开始的地方:我可以,感谢Django的pythonic结构,检索内部的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
Run Code Online (Sandbox Code Playgroud)

我希望在我的头脑中删除代码时,我没有犯过太多错误!

Mar*_*mro 16

您可以在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")
Run Code Online (Sandbox Code Playgroud)