Django 动态网址

Posted

技术标签:

【中文标题】Django 动态网址【英文标题】:Django dynamic urls 【发布时间】:2012-03-15 10:38:13 【问题描述】:

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

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

当然,我还需要将它挂接到我的 url 文件中,但问题就从这里开始:感谢 Django 的 Pythonic 结构,我可以在 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

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

【问题讨论】:

【参考方案1】:

您可以在 url 中使用 named groups 将数据传递给视图,并且不需要在 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】:

您不需要为整个数据库中的每个项目指定一个特定的 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

【讨论】:

以上是关于Django 动态网址的主要内容,如果未能解决你的问题,请参考以下文章

Django框架初入

使用django将旧网址重定向到新网址[重复]

Django 视图与网址

Django - 按钮网址

Django 网址配置

Django:相同的方法不同的网址