객체에 대한 Django 관리 URL 얻기


168

Django 1.0 이전에는 객체의 관리자 URL을 얻는 쉬운 방법이 있었고 다음과 같이 사용할 작은 필터를 작성했습니다. <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로 업데이트하려고하는데 이것이 내가 겪었던 장애물 중 하나입니다. 관리자 URL을 얻는 방법이 더 이상 작동하지 않습니다.

django 1.0에서 어떻게 할 수 있습니까? (또는 svn의 최신 버전으로 업데이트하려고 할 때 1.1).

답변:


61

나는 전화를 걸려 reverse('admin_index')고 끊임없이 django.core.urlresolvers.NoReverseMatch오류 가 발생 하는 비슷한 문제가있었습니다 .

내 urls.py 파일에 이전 형식의 관리자 URL이있는 것으로 나타났습니다.

나는 이것을 urlpatterns에 가지고 있었다 :

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

관리자 화면은 작동하지만 사용되지 않는 방법입니다. 나는 이것을 이것을 바꿔야했다.

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

일단 그렇게하면 리버스 관리 URL 문서 에서 약속 된 모든 장점이 작동하기 시작했습니다.


놀랍게도, 이것은 ModelAdmin의 get_urls () 메소드에서 호출되지 않은 다른 문제를 해결했습니다. 감사!
Arnaud

8
이 문제에 대한 최고의 URL : docs.djangoproject.com/en/dev/ref/contrib/admin/…
Dingo

4
이 "답변"은 정확하지 않으며 관리자 앱을 앱에 올바르게 추가하는 방법 만 보여 주므로 저자의 다른 문제가 해결되었습니다. 실제 질문에 대한 진짜 대답은 다음과 같습니다 - markmuetz에서
클랜 Shanaghy

또한 모델에 대한 관리자 인터페이스를 등록해야합니다. 그렇지 않으면 URL이 존재하지 않습니다.
Flimm

412

URL 리졸버를 템플릿에서 직접 사용할 수 있으므로 직접 필터를 작성할 필요가 없습니다. 예 :

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

참조 : 문서


1
markmuetz-이것은 공식 Django 문서에 있습니까? (템플릿에서 관리자 리버스 URL을 사용하는 방법)? 그렇지 않다면 그렇습니다.
shacker

7
shacker-모든 문서에 포함되어 있습니다. 한 곳에는 없습니다. "url"템플릿 태그는 여기 에 문서화되어 있습니다 . "Django 1.1의 새로운 기능"섹션에서 문서는 네임 스페이스가있는 URL이 양호하고 URL 네임 스페이스에 대한 섹션을 가리 킵니다 . 모두 함께 사용하면 템플릿에서 관리 응용 프로그램을 쉽게 참조 할 수 있습니다. NB 답장을 쓸 때 문서가 다르다는 것을 기억합니다.
markmuetz

3
선택의 "목록"에 대한 링크를 얻는 방법을 알고 있습니까? 예 : "{% url admin : polls_choice_add %}"가 "/ admin / polls / choice / add"를 제공하는 경우 "/ admin / polls / choice"를 표시하는 것과 동등한 것은 무엇입니까?
DarwinSurvivor

2
{% url admin : polls_choice_changelist %}는 '/ admin / polls / choice'url을 반환합니다
luc


101
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__())

이것은 admin의 기본 애플리케이션 네임 스페이스 인 admin : url namespaces를 사용한다는 점을 제외하고 hansen_j의 솔루션과 유사 합니다.


3
고마워요. 내가 바꿀 한 가지 : args=[object.pk]대신 사용하십시오 args=[object.id]. 기본 키 필드의 이름이와 다른 경우가 더 일반적 id입니다.
스토킹

5
좋은 대답입니다. 참고로 최신 장고를 사용하는 사람은 object._meta.module_name을 object._meta.model_name으로 변경해야합니다.
Jagu

장고 초보자에게서 큰 감사합니다. object._meta.app_labeldjango의 자체 인증 앱의 이름을 얻겠습니다. 그것은이다 auth예를 들어, reverse(admin:auth_user_change, args=[object.id])사용자 변경 페이지로 이동
Gret

2
객체를 obj로 변경하십시오. 이 사람은 예약 된 내장 기호를 쓰고 있습니다.
Kevin Parker

17

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

한 가지 단점은 장고 템플릿 (예 :)에서 밑줄 속성에 직접 액세스 할 수 없으므로 뷰에서 템플릿 컨텍스트로 객체 {{ myinstance._meta }}를 전달해야한다는 opts것입니다.


2
문서 URL이 변경되었습니다! 참조 : docs.djangoproject.com/en/1.9/ref/contrib/admin/…
Wim Feijen

12

본질적으로 Mike Ramirez의 답변과 동일하지만 장고 표준 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])

11

1.1 장고 이전의 경우 간단합니다 (기본 관리 사이트 인스턴스의 경우).

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

8
새로운 네임 스페이스를 통해 admin : % s_ % s_change
Teebes

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 %}를 사용하십시오 (템플릿 태그를 먼저로드하는 것을 잊지 마십시오)


1

표현식을 다음과 같이 변경하여이 문제를 해결했습니다.

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

작동하는 것 같지만 깨끗하지 않습니다.


2
이것은 1.0에서는 작동하지만 1.1에서는 작동하지 않으므로 더 나은 해결책이 있습니다. Alex Koshelev의 답변을 참조하십시오.
Carl Meyer

실제로 나는 그것을 시도했지만 작동하지 않았으며 그는 1.0이라고 말했습니다.
hasen

URL 이름 공간이 도입됨에 따라 구문이 1.1에서 변경되었습니다. docs.djangoproject.com/en/dev/topics/http/urls/…
sleepyjames

-1

모델을 사용하는 또 다른 옵션은 다음과 같습니다.

기본 모델을 작성하십시오 (또는 특정 모델에 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()

2
나는 이것이 좋은 해결책이라고 생각하지 않습니다. 문자열 형식으로 URL을 작성하는 것은 나쁜 습관입니다. reverse ()를 사용하십시오.
guettli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.