[django] 객체에 대한 Django 관리 URL 얻기

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).



답변

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

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

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

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

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

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

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


답변

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

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

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

{% url 'admin:polls_choice_changelist' %}

참조 : 문서


답변

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의 솔루션과 유사 합니다.


답변

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것입니다.


답변

본질적으로 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])


답변

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

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


답변

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