获取对象的Djangopipe理员url

在Django 1.0之前,有一个简单的方法可以获得一个对象的pipe理url,并且我写了一个小的filter,像这样使用: <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] ) 

得到的url。

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

我怎么能在django 1.0中做到这一点? (或1.1,因为我试图更新到svn的最新版本)。

我有一个类似的问题,我会尝试调用reverse('admin_index') ,并不断得到django.core.urlresolvers.NoReverseMatch错误。

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

我在我的urlpatterns有这个:

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

这使得pipe理屏幕可以正常工作,但是这是不赞成使用的方式。 我需要改变它:

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

一旦我这样做了,在“ 撤销pipe理url”文档中承诺的所有优点开始运作。

您可以直接在模板中使用URLparsing器,无需编写自己的filter。 例如

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

参考: 文件

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

这与hansen_j的解决scheme类似,只不过它使用了url命名空间 admin:作为admin的默认应用程序名称空间。

更高版本还有另一种方法,比如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> 

在哪里opts是像mymodelinstance._metaMyModelClass._meta

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

对于1.1之前的django,这很简单(对于默认pipe理站点实例):

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

基本上和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]) 

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

我通过改变expression式来解决这个问题:

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

它似乎在工作,但我不清楚它的清洁。

这是另一种select,使用模型:

创build一个基本模型(或者只是将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 

从该基本模型inheritance

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

在模板中使用它

 {{ user.admin_link }} 

或查看

 user.admin_link()