获取对象的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._meta
或MyModelClass._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()