获取对象的Django管理url


168

在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中的最新版本)。

Answers:


61

我遇到了类似的问题,尝试打电话给我,reverse('admin_index')并且不断django.core.urlresolvers.NoReverseMatch出错。

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

我在urlpatterns中有这个:

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

这可以使管理屏幕正常工作,但已被弃用。我需要将其更改为:

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

完成此操作后,“ 反向管理URL”文档中承诺的所有好处就开始起作用。


太棒了,这解决了我没有调用ModelAdmin的get_urls()方法时遇到的另一个问题。谢谢!
Arnaud


4
这个“答案”是不正确的,仅显示了如何将管理应用正确添加到您的应用中,从而解决了作者遇到的另一个问题。实际问题的真正答案如下-来自markmuetz
Declan Shanaghy 2011年

另外,您需要为该模型注册管理界面,否则该URL将不存在。
Flimm

412

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

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

参考:文档


1
markmuetz-官方Django文档中是否有此内容?(如何在模板中使用管理员反向网址)?如果不是,应该是。
shacker's

7
骇客-全部集中在文档中……只是不在一个地方。此处记录 “ url”模板标记。在“ Django 1.1的新增功能:”部分中,文档说,命名空间URL很好,并指向URL命名空间部分。将所有内容放在一起,可以轻松地在模板中引用管理应用程序。注意:我记得写回复时的文档有所不同。
markmuetz

3
您知道如何获得选项“列表”的链接吗?示例:如果“ {%url admin:polls_choice_add%}”给出“ / admin / polls / choice / add”,那么相当于“ / admin / polls / choice”的含义是什么?
DarwinSurvivor 2011年

2
{%url admin:polls_choice_changelist%}返回'/ admin / polls / choice'网址
luc

35

101
from django.core.urlresolvers 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:是管理员的默认应用程序名称空间。


3
谢谢,有帮助。我会改变的一件事:使用args=[object.pk]而不是args=[object.id]。当主键字段的名称不是时,它涵盖了更常见的情况id
秸秆

5
好答案。仅供参考,使用较新的Django的任何人都需要将object._meta.module_name更改为object._meta.model_name
Jagu 2015年

非常感谢django新手。object._meta.app_label让我最终获得django自己的身份验证应用程序的名称。这是auth,例如reverse(admin:auth_user_change, args=[object.id])跳转到更改用户页面
GRET

2
确保将对象更改为obj。这个家伙写了一个保留的内置符号。
凯文·帕克,

17

对于更高版本,还有另一种方式,例如在1.10中

{% 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>

在哪里optsmymodelinstance._metaMyModelClass._meta

一个陷阱是您不能直接在Django模板(例如{{ myinstance._meta }})中访问下划线属性,因此您必须opts从视图中将对象作为模板上下文传递。



12

基本上与Mike Ramirez的答案相同,但在风格上与django标准get_absolute_url方法更加简单和接近:

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


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%}(别忘了先加载templatetag)


1

我通过将表达式更改为:

reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )

这要求/假定根URL conf具有“ admin” URL处理程序的名称,主要是“ django-admin”,

即在根URL conf:

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

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


2
这适用于1.0,但不适用于1.1,后者具有更好的解决方案:请参阅Alex Koshelev的答案。
卡尔·梅耶

其实我尝试了一下,但是没有用,他说是1.0版本,不是吗?
哈森

语法在1.1中随着网址名称间隔
sleepyjames

-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()

2
我认为这不是一个好的解决方案。用字符串格式构建URL是一个坏习惯。请使用reverse()。
guettli 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.