【问题标题】:Getting Django admin url for an object获取对象的 Django 管理 url
【发布时间】:2010-10-16 05:17:21
【问题描述】:

在 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,这是我遇到的障碍之一,获取管理员 url 的方法不再起作用。

我如何在 django 1.0 中做到这一点? (或者 1.1,因为我正在尝试更新到 svn 中的最新版本)。

【问题讨论】:

    标签: django django-admin django-urls


    【解决方案1】:

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

    {% url 'admin:index' %}

    {% url 'admin:polls_choice_add' %}

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

    {% url 'admin:polls_choice_changelist' %}

    参考:Documentation

    【讨论】:

    • markmuetz - 这是在任何地方的官方 Django 文档中吗? (如何在模板中使用管理员反向 URL)?如果没有,应该是。
    • shacker - 都在文档中……只是不在一个地方。 “url”模板标签记录在here。在“Django 1.1 中的新功能:”部分中,文档说命名空间 URL 很好,并指向 the section on URL namespaces。将它们放在一起可以让您在模板中轻松引用管理应用程序。注意:我记得我写回复时文档有所不同。
    • 你知道如何获得选择“列表”的链接吗?示例:如果“{% url admin:polls_choice_add %}”给出“/admin/polls/choice/add”,那么给出“/admin/polls/choice”的等价物是什么?
    • {% url admin:polls_choice_changelist %} 返回 '/admin/polls/choice' url
    【解决方案2】:
    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
    • 好答案。仅供参考,任何使用更新的 django 的人都需要将 object._meta.module_name 更改为 object._meta.model_name
    • 非常感谢 django 新手。 object._meta.app_label 让我最终获得 django 自己的身份验证应用程序的名称。是auth,例如reverse(admin:auth_user_change, args=[object.id])跳转到更改用户页面
    • 一定要把object改成obj。这家伙写完了一个保留的内置符号。
    【解决方案3】:

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

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

    我的 urlpatterns 中有这个:

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

    这可以让管理屏幕正常工作,但已被弃用。我需要将其更改为:

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

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

    【讨论】:

    • 太棒了,这解决了我在未调用 ModelAdmin 的 get_urls() 方法时遇到的另一个问题。谢谢!
    • 解决此问题的最佳网址:docs.djangoproject.com/en/dev/ref/contrib/admin/…
    • 这个“答案”不正确,它只是展示了如何正确地将管理应用程序添加到您的应用程序中,这解决了作者遇到的另一个问题。实际问题的真正答案如下 - 来自 markmuetz
    • 另外,您需要为模型注册管理界面,否则URL将不存在。
    【解决方案4】:

    以后的版本还有另一种方式,比如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 对象作为模板上下文传入。

    【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 使用新的命名空间是 admin:%s_%s_change
      【解决方案7】:

      我通过将表达式更改为:

      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,但不适用于 1.1,它有更好的解决方案:请参阅 Alex Koshelev 的回答。
      • 其实我试过了还是不行,他说是1.0的,不是吗?
      • 语法在 1.1 中发生了变化,引入了 url 命名空间:docs.djangoproject.com/en/dev/topics/http/urls/…
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

        • 我认为这不是一个好的解决方案。使用字符串格式构建 URL 是一个坏习惯。请使用 reverse()。
        猜你喜欢
        • 2011-07-09
        • 1970-01-01
        • 2017-02-06
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 2013-07-25
        • 2023-03-10
        相关资源
        最近更新 更多