在Django 1.0之前,有一个简单的方法来获取一个对象的管理url,我写了一个小的过滤器,我可以这样使用:<a href="{{object|admin_url}}" ....>……< / >

基本上我使用的是url反向函数视图名是django。contrib。admin。views。main。change_stage

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

来获取url。

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

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


当前回答

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

其他回答

我通过将表达式更改为:

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

这需要/假设根url配置文件有一个admin url处理程序的名字,主要是“django-admin”。

例如,在根url conf中:

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

它似乎起作用了,但我不确定它是否干净。

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

创建基本模型(或将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()

本质上与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])

使用模板标记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的东西。或MyModelClass._meta

一个问题是你不能在Django模板中直接访问下划线属性(比如{{myinstance. xml)。_meta}}),所以你必须把opts对象作为模板上下文从视图中传入。

要进入管理页面或管理登录页面,我们可以使用下面的链接。这对我很管用

{% url 'admin:index' %}

这个url直接把我带到管理页面。