获取Django管理URL以获取对象

时间:2009-03-29 11:19:22

标签: django django-admin django-urls

在Django 1.0之前有一个简单的方法来获取对象的管理URL,我写了一个小的过滤器,我会像这样使用:<a href="{{ object|admin_url }}" .... > ... </a>

基本上我使用的是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,这是我遇到的障碍之一,获取管理网址的方法不再适用。

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

9 个答案:

答案 0 :(得分:356)

您可以直接在模板中使用URL解析器,无需编写自己的过滤器。 E.g。

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

参考:Documentation

答案 1 :(得分:85)

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的解决方案类似,只是它使用url namespaces,admin:作为管理员的默认应用程序命名空间。

答案 2 :(得分:54)

我遇到类似的问题,我会尝试拨打reverse('admin_index')并且不断收到django.core.urlresolvers.NoReverseMatch错误。

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

我的urlpatterns中有这个:

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

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

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

一旦我这样做,Reversing Admin URLs文档中承诺的所有善意就开始起作用了。

答案 3 :(得分:12)

对于更高版本,还有另一种方法,例如in 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对象作为模板上下文。

答案 4 :(得分:10)

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

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

答案 5 :(得分:8)

与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])

答案 6 :(得分:3)

如果您使用的是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%}(不要忘记先加载模板标签)

答案 7 :(得分:1)

我通过将表达式更改为:

来解决这个问题
reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )

这需要/假设根url conf具有“admin”url处理程序的名称,主要是名称为“django-admin”,

即。在根网址:

url(r'^admin/(.*)', admin.site.root, name='django-admin'),

它似乎有效,但我不确定它的清洁度。

答案 8 :(得分:0)

这是另一种选择,使用模型:

创建基本模型(或者只是将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()