从 1.8 升级到 1.9 Django Admin get_urls 不起作用

Posted

技术标签:

【中文标题】从 1.8 升级到 1.9 Django Admin get_urls 不起作用【英文标题】:Upgrading from 1.8 to 1.9 Django Admin get_urls not working 【发布时间】:2016-10-07 11:00:33 【问题描述】:

我正在使用 Django 管理员,并且刚刚从 1.8 升级到 1.9。在 1.8 中,我向 change_form 添加了一个单击按钮,该按钮使用 get_urls 覆盖将我带到另一个 html 模板。像这样:

def get_urls(self):
    urls = super(arunAdmin, self).get_urls()
    my_urls = patterns('',
        (r'(\d+)/tarrespgraph/$', self.admin_site.admin_view(self.tarrespgraph)),
        )
return my_urls + urls

根据我在网上看到的一些建议,我将其更改为:

def get_urls(self):
    urls = super(arunAdmin, self).get_urls()
    my_urls = [
        url(r'^tarrespgraph/$', self.admin_site.admin_view(self.tarrespgraph)),
    ]        
    return my_urls + urls

但收到此错误:

主键为“132/change/tarrespgraph”的 NBI Graph 对象不存在。

Django 可以毫无问题地找到自定义的 change_form.html。我的自定义模板 (tarrespgraph.html) 与我的自定义 change_form.html 位于同一文件夹中。 Django 在哪里寻找我的自定义模板?我应该移动 tarrespgraph.html,还是更改对 url 的引用?提前感谢您的帮助!

【问题讨论】:

根据您的代码,我不知道它之前是如何工作的。但看起来在新状态下您没有接受\d+ 的模式。此外,这仍然不能解释 URL 中的 /change/ 【参考方案1】:

您可能不应该从您的 url 模式中删除 (\d+) 组。请尝试以下操作:

my_urls = [
    url(r'^(\d+)/tarrespgraph/$', self.admin_site.admin_view(self.tarrespgraph), name='tarrespgraph'),
]

请注意,我添加了一个名称,这将让我们稍后将 url 反转。

没有(\d+) 组,新的 url 模式与 url 不匹配,因此它由给出错误的管理员更改视图处理。

您还需要更改模板中的链接。在 Django 1.9 中,Django 已将 change 附加到管理员更改 url(例如,现在是 /admin/app/model/132/change/ 而不是 /admin/app/model/132/。这意味着您的相对链接 'tarrespgraph/' 现在指向 /admin/app/model/132/change/tarrespgraph/ 而不是 /admin/app/model/132/tarrespgraph/。您可以将相对链接更改为../tarrespgraph/。但是,改用url 标记会不太脆弱:

<a class="tarrespgraph" href="% url 'admin:tarrespgraph' object_id %">

【讨论】:

我尝试将其添加回来(如您在上面指出的那样),但我仍然收到错误。 在 1.8 中,Django 没有将两个 /change/ 添加到 url 中,我不知道它是如何使用它们来寻找模板的,但肯定会表现得不同。 经过反复试验,我发现这行得通: url(r'^(\d+)/change/tarrespgraph/change/$', self.admin_site.admin_view(self.tarrespgraph)), 正如我所说,Django 1.9 已将更改视图的 url 更改为在末尾包含change/(请参阅the release notes)。我不确定第二个“更改”来自哪里,因为您没有显示如何链接到模板中的页面。除非您愿意,否则您不需要使用 r'^(\d+)/change/tarrespgraph/change/$ 代替 r'^(\d+)/tarrespgraph/$ 关于你提到的其余内容,在我的 arunAdmin 类的顶部,我有这个: tarrespgraph_template = 'admin/nbig/arun/tarrespgraph.html' 然后,我有一个函数在我的名为 def tarrespgraph(self, request, id) 的 arunAdmin 类中定义。在该函数的末尾,我使用 render 来响应如下: return render_to_response(self.tarrespgraph_template, ........... 在 change_form.html 中,我添加了一个像这样的单击按钮:% trans "点击这里查看目标响应率图表。" %

以上是关于从 1.8 升级到 1.9 Django Admin get_urls 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django jsonfields ValidationError: [u'Enter valid JSON'] 从 1.7 升级到 1.9

从 Django 1.6 升级到 1.9:python manage.py migrate 失败

我无法从 Django 1.8 升级到 2.0

从 1.8 升级到 2.2.4 后,Django 无法创建用于单元测试的表

从 Django 1.6 (with south) 升级到 1.8 不会修改用户表上的“last_login”

无法将 Django 从 1.7 迁移到 1.8