... 基本上我正在使用视图名称为 'django.contrib.admin.views.main.change_stage' 的 url reverse 函数获取网址。正如......" /> ... 基本上我正在使用视图名称为 'django.contrib.admin.views.main.change_stage' 的 url reverse 函数获取网址。正如......"> ... 基本上我正在使用视图名称为 'django.contrib.admin.views.main.change_stage' 的 url reverse 函数获取网址。正如......" />
在 Django 1.0 之前,有一种简单的方法可以获取对象的 admin url,我编写了一个小过滤器,我会像这样使用它:<a href="{{ object|admin_url }}" .... > ... </a>
基本上我正在使用视图名称为 'django.contrib.admin.views.main.change_stage'
的 url reverse 函数
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'<a href="%s">Edit %s</a>' % (url, obj.__unicode__())
这类似于 hansen_j 的解决方案,只是它使用 url namespaces, admin: 作为 admin 的默认应用程序命名空间。
args=[object.pk]
而不是 args=[object.id]
。它涵盖了更常见的情况,即主键字段的名称不同于 id
。
object._meta.app_label
让我最终获得 django 自己的身份验证应用程序的名称。是auth
,例如reverse(admin:auth_user_change, args=[object.id])
跳转到更改用户页面
我有一个类似的问题,我会尝试调用 reverse('admin_index')
并不断收到 django.core.urlresolvers.NoReverseMatch
错误。
原来我的 urls.py 文件中有旧格式的管理 url。
我在我的 urlpatterns 中有这个:
(r'^admin/(.*)', admin.site.root),
这使管理屏幕正常工作,但已被弃用。我需要将其更改为:
(r'^admin/', include(admin.site.urls) ),
一旦我这样做了,Reversing Admin URLs 文档中承诺的所有优点就开始起作用了。
使用模板标签 admin_urlname:
对于更高版本 (>=1.10),还有另一种方法,由 the Django documentation 推荐,使用模板标记 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._meta
或 MyModelClass._meta
一个问题是您不能直接在 Django 模板(如 {{ myinstance._meta }}
)中访问下划线属性,因此您必须将视图中的 opts
对象作为模板上下文传入。
与 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])
对于 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 conf 有一个“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 %} (不要忘记先加载模板标签)
这是另一种选择,使用模型:
创建一个基本模型(或者只是将 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()