从 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 失败
从 1.8 升级到 2.2.4 后,Django 无法创建用于单元测试的表