【问题标题】:urlpatterns don't get updated after DB insertion?插入数据库后 urlpatterns 不会更新?
【发布时间】:2011-11-01 14:22:18
【问题描述】:

我有一个 html 表单,它将数据插入到一个名为 srv 的表中。

我已经构建了 urls.py 以捕获每个插入:

for item in srv.objects.all():
    linkSrv = item.loc.lower() + '/srv/' + item.subctg.lower() + '/' + item.title.lower()
    urlpatterns += patterns('',
    url(r'^' + linkSrv + '/$', 'beta.views.queryFromIndexDeep'),
)

在进行一次插入之后,例如loc='loc', subctg='subctg' 和 title='title' 如果我将浏览器指向 127.0.0.1:8000/loc/srv/subctg/title/ 我会收到 http404 错误(没有匹配的 url)

如果我“强制保存” urls.py(vim urls.py 然后 :x!) - 在插入 loc、subct、title 之后 - 那么我可以成功访问 127.0.0.1:8000/loc/srv/subctg /标题/

任何人都可以解释一下吗?每次在 srv 表中插入一行时,似乎都需要“更新”urlpatterns。

【问题讨论】:

  • 你为什么要这么做?为什么不使用正则表达式?
  • 因为我是 django 的新手,并且我管理 urlpatterns,但我现在正在阅读有关正则表达式的信息
  • 太好了,看看答案,看看这个docs.djangoproject.com/en/1.3/intro/tutorial03

标签: python django django-urls


【解决方案1】:

你应该只使用这样的东西:

urlpatterns += patterns('',
    url(r'^(?P<loc>\w+)/(?P<subctg>\w+)/(?P<title>\w+)/$',
                         'beta.views.queryFromIndexDeep'),
)

使用正则表达式来匹配您的视图更容易,建议使用。在您看来,上述内容将匹配像 beta.views.queryFromIndexDeep(request, loc, subctg, title) 这样定义的函数,您可以从中继续使用这些变量从定义的模型中提取相关数据。

【讨论】:

  • 谢谢,我现在正在尝试 loc、subctg 和 title 应该通过访问必要的模型在 queryFromIndexDeep 中获得,对吧?你能告诉我为什么只有在 urls.py 被强制保存后它才能工作(使用我的代码)吗?
  • 它工作正常,因为您为数据库中的每个条目手动创建新的 url 定义。当您创建一个新条目并运行更新代码时,它才能找到它。使用上述内容,在您看来,您可以使用 srv.objects.get(loc=loc, subctg=subctg, title=title) 之类的东西来检索当前 url 的对象。
  • 我已经用上面的内容更新了 urls.py 并设置了 queryFromIndexDeep(request, loc, subctg, title): return render_to_response('test.html') 但我仍然得到 404访问与上述模式匹配的链接。我究竟做错了什么 ? :(
  • 没关系,我明白了……我在标题和 subctg 字段中有一些空格……我必须弄清楚如何将它们插入到正则表达式中……非常感谢! !
  • 对于你的正则表达式,你可能想要一些更轻松的东西......例如(?P&lt;loc&gt;[\w-]+) 匹配单词和破折号(常见于 url),或者甚至 (?P&lt;loc&gt;[^/]+) 匹配所有内容到斜线。您应该尝试一下最适合您的方法。
【解决方案2】:

为您的 srv 模型添加一个 slugfield(唯一)并向模型添加一个方法

def get_absolute_url(self):
    return /yourapp/%s/ % self.slug

然后在 urls 中使用一个模式来匹配这个

url(r'^srv/(?P<slug>[-\w]+)/$', yourgenericview),

查看 django slugify 代码片段以获得乐趣http://djangosnippets.org/snippets/690/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2021-11-23
    • 2013-09-15
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多