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


当前回答

如果你使用的是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.1之前的django,它很简单(对于默认的管理站点实例):

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

我通过将表达式更改为:

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'),

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

如果你使用的是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)

我有一个类似的问题,我试图调用反向('admin_index'),并不断得到django.core.urlresolver . noreversematch错误。

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

我在我的urlpatterns中有这个:

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

这可以让管理屏幕工作,但这是不推荐的方式。我需要把它改成这样:

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

一旦我这样做了,所有在反向管理url文档中承诺的好处开始工作。

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