如何获取对象的 Django 管理 url?

问题描述 投票:0回答:10

在 Django 1.0 之前,有一种简单的方法来获取对象的管理 url,我编写了一个小过滤器,如下所示:

<a href="{{ object|admin_url }}" .... > ... </a>

基本上我使用的是 url 反向功能,视图名称为

'django.contrib.admin.views.main.change_stage'

reverse( 'django.contrib.admin.views.main.change_stage', args=[app_label, model_name, object_id] )

获取网址。

正如你可能已经猜到的,我正在尝试更新到最新版本的 Django,这是我遇到的障碍之一,获取管理 url 的方法不再起作用。

如何在 django 1.0 中做到这一点? (或者 1.1,因为我正在尝试更新到 svn 中的最新版本)。

django django-admin django-urls
10个回答
547
投票

您可以直接在模板中使用 URL 解析器,无需编写自己的过滤器。例如

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

{% url 'admin:polls_choice_change' choice.id %}

{% url 'admin:polls_choice_changelist' %}

参考:文档


127
投票
from django.urls import reverse

def url_to_edit_object(obj):
  url = reverse('admin:%s_%s_change' % (obj._meta.app_label,  obj._meta.model_name),  args=[obj.id] )
  return u'<a href="%s">Edit %s</a>' % (url,  obj.__unicode__())

这与 hansen_j 的解决方案类似,只是它使用 url 命名空间,admin:是管理员的默认应用程序命名空间。


67
投票

我遇到了类似的问题,我尝试拨打

reverse('admin_index')
,但不断收到
django.core.urlresolvers.NoReverseMatch
错误。

原来我的 urls.py 文件中有旧格式的管理 URL。

我的 urlpatterns 中有这个:

(r'^admin/(.*)', admin.site.root),

这可以让管理屏幕正常工作,但这是不推荐的做法。 我需要将其更改为:

(r'^admin/', include(admin.site.urls) ),

一旦我这样做了,反转管理 URL文档中承诺的所有好处就开始发挥作用。


25
投票

与 Mike Ramirez 的答案基本相同,但在风格上更简单、更接近 django 标准

get_absolute_url
方法:

from django.urls import reverse

def get_admin_url(self):
    return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name),
                   args=[self.id])

20
投票

使用模板标签
admin_urlname
:

对于更高版本(>=1.10)还有另一种方法,由Django文档推荐,使用模板标签

admin_urlname

{% load admin_urls %}
<a href="{% url opts|admin_urlname:'add' %}">Add user</a>
<a href="{% url opts|admin_urlname:'delete' user.pk %}">Delete this user</a>

其中

opts
类似于
mymodelinstance._meta
MyModelClass._meta

一个问题是您无法直接在 Django 模板中访问下划线属性(如

{{ myinstance._meta }}
),因此您必须从视图中将
opts
对象作为模板上下文传递。


18
投票

对于 1.1 之前的 django 来说很简单(对于默认管理站点实例):

reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))

3
投票

我通过将表达式更改为:

解决了这个问题
reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )

这需要/假设根 url conf 有一个“admin”url 处理程序的名称,主要是“django-admin”,

即在根 URL 配置中:

url(r'^admin/(.*)', admin.site.root, name='django-admin'),

它似乎可以工作,但我不确定它是否干净。


3
投票

如果您使用的是 1.0,请尝试制作如下所示的自定义模板标签:

def adminpageurl(object, link=None):
    if link is None:
        link = object
    return "<a href=\"/admin/%s/%s/%d\">%s</a>" % (
        instance._meta.app_label,
        instance._meta.module_name,
        instance.id,
        link,
    )

然后只需在模板中使用 {% adminpageurl my_object %} (不要忘记先加载模板标签)


-1
投票

这是另一种选择,使用模型:

创建一个基本模型(或者只是将 admin_link 方法添加到特定模型)

class CommonModel(models.Model):
    def admin_link(self):
        if self.pk:
            return mark_safe(u'<a target="_blank" href="../../../%s/%s/%s/">%s</a>' % (self._meta.app_label,
                    self._meta.object_name.lower(), self.pk, self))
        else:
            return mark_safe(u'')
    class Meta:
        abstract = True

继承该基本模型

   class User(CommonModel):
        username = models.CharField(max_length=765)
        password = models.CharField(max_length=192)

在模板中使用它

{{ user.admin_link }}

或查看

user.admin_link()

-1
投票

要进入管理页面或管理登录页面,我们可以使用以下链接。它对我有用 -

{% url 'admin:index' %}

此网址将我直接带到管理页面。

© www.soinside.com 2019 - 2024. All rights reserved.