django path用法




獲取對象的Django管理url (6)

基本上和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])

在Django 1.0之前,有一種簡單的方法可以獲取對象的管理網址,並且我寫了一個小型過濾器,可以像這樣使用: <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] )

獲取網址。

正如你可能已經猜到的那樣,我試圖更新到Django的最新版本,這是我遇到的障礙之一,獲取管理網址的方法不再有效。

我如何在django 1.0中做到這一點? (或1.1,因為我試圖更新到svn的最新版本)。


如果您使用的是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)


對於更高版本,還有另一種方法,例如在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>

optsmymodelinstance._metaMyModelClass._meta

一個問題是你不能直接在Django模板中訪問下劃線屬性(如{{ myinstance._meta }} ),所以你必須從視圖中將opts對像作為模板上下文傳入。


您可以直接在模板中使用URL解析器,無需編寫自己的過濾器。 例如

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

Ref: Documentation


我通過改變表達式來解決這個問題:

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'),

它似乎在工作,但我不清楚它的干淨。


這是另一種選擇,使用模型:

創建一個基本模型(或者只需將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()




django-urls