【问题标题】:Upgrading from 1.8 to 1.9 Django Admin get_urls not working从 1.8 升级到 1.9 Django Admin get_urls 不起作用
【发布时间】: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/

标签: django django-templates django-admin


【解决方案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 "点击这里查看目标响应率图表。" %}
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 2016-03-06
  • 2020-05-17
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多