在Django 1.0之前有一个简单的方法来获取一个对象的管理URL,我写了一个小的过滤器,我会像这样使用: ...
基本上我使用的是url reverse函数,视图名称为 '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中的最新版本).
您可以直接在模板中使用URL解析器,无需编写自己的过滤器.例如
{% 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(obj): url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.model_name), args=[obj.id] ) return u'Edit %s' % (url, obj.__unicode__())
这类似于hansen_j的解决方案,除了它使用url命名空间,admin:是admin的默认应用程序命名空间.
我有一个类似的问题,我会尝试打电话reverse('admin_index')
,并不断收到django.core.urlresolvers.NoReverseMatch
错误.
结果我在urls.py文件中有旧的格式管理URL.
我在我的urlpatterns中有这个:
(r'^admin/(.*)', admin.site.root),
它使管理屏幕工作,但是不赞成这样做.我需要将其更改为:
(r'^admin/', include(admin.site.urls) ),
一旦我这样做,Reversing Admin URL文档中承诺的所有善意就开始起作用了.
对于更高版本,还有另一种方法,例如在1.10中:
{% load admin_urls %} Add user Delete this user
在哪里或opts
类似的东西mymodelinstance._meta
MyModelClass._meta
一个问题是您无法直接在Django模板中访问下划线属性(例如{{ myinstance._meta }}
),因此您必须opts
将视图中的对象作为模板上下文传递.
对于1.1之前的django,它很简单(对于默认的管理站点实例):
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])