객체에 대한 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.