Django dynamic urls



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

我的方法如下:我创建了一个名为sitemanager的应用程序,它由上面描述的页面模型和一个上下文处理器组成,该处理器将页面添加到我的模板(用于菜单等)的上下文中,效果很好。

当然,我还需要将它挂接到我的url文件中,但问题就从这里开始了:由于Django的Python结构,我可以在urls.py中检索Page模型,并相应地生成我的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

我希望我在脑海中剥离代码时没有犯太多错误!

您可以在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

最新更新