Django에서 객체의 관리자 URL 가져오기
Django에서 객체의 관리자 URL 가져오기
get_admin_url() 메서드 사용
모든 Django 모델은 get_admin_url()
메서드를 제공합니다. 이 메서드는 객체의 pk (기본 키)를 사용하여 관리자 변경 뷰에 대한 URL을 반환합니다.
from django.contrib.admin.utils import get_admin_url
obj = MyModel.objects.get(pk=1)
admin_url = get_admin_url(obj)
admin_url
변수는 다음과 같은 형식의 URL을 포함합니다.
/admin/myapp/mymodel/1/change/
reverse() 함수 사용
django.urls
모듈에서 제공하는 reverse()
함수를 사용하여 관리자 URL을 생성할 수도 있습니다.
from django.urls import reverse
obj = MyModel.objects.get(pk=1)
admin_url = reverse('admin:{app_label}_{model_name}_change', args=(obj.pk,))
admin_url
변수는 get_admin_url()
메서드를 사용할 때와 동일한 URL을 포함합니다.
템플릿 태그 사용
Django 템플릿에서 admin_urlname
템플릿 태그를 사용하여 관리자 URL을 생성할 수 있습니다.
{% load admin_urls %}
<a href="{% admin_urlname obj %}">Edit object</a>
admin_urlname
태그는 객체의 모델 이름과 pk를 사용하여 관리자 변경 뷰에 대한 URL을 생성합니다.
사용자 지정 메서드 사용
모델에 사용자 지정 메서드를 추가하여 관리자 URL을 생성할 수도 있습니다.
class MyModel(models.Model):
def get_admin_url(self):
return reverse('admin:{app_label}_{model_name}_change', args=(self.pk,))
이렇게 하면 다음과 같이 객체에서 직접 URL을 가져올 수 있습니다.
obj = MyModel.objects.get(pk=1)
admin_url = obj.get_admin_url()
추가 정보
Django에서 객체의 관리자 URL 가져오기 예제
from django.contrib.admin.utils import get_admin_url
from django.urls import reverse
class MyModel(models.Model):
name = models.CharField(max_length=255)
# 1. `get_admin_url()` 메서드 사용
obj = MyModel.objects.get(pk=1)
admin_url_1 = get_admin_url(obj)
# 2. `reverse()` 함수 사용
admin_url_2 = reverse('admin:{app_label}_{model_name}_change', args=(obj.pk,))
# 3. 템플릿 태그 사용
{% load admin_urls %}
<a href="{% admin_urlname obj %}">Edit object</a>
# 4. 사용자 지정 메서드 사용
class MyModel(models.Model):
name = models.CharField(max_length=255)
def get_admin_url(self):
return reverse('admin:{app_label}_{model_name}_change', args=(self.pk,))
obj = MyModel.objects.get(pk=1)
admin_url_4 = obj.get_admin_url()
print(f'admin_url_1: {admin_url_1}')
print(f'admin_url_2: {admin_url_2}')
print(f'admin_url_3: {admin_url_3}')
print(f'admin_url_4: {admin_url_4}')
결과:
admin_url_1: /admin/myapp/mymodel/1/change/
admin_url_2: /admin/myapp/mymodel/1/change/
admin_url_3: /admin/myapp/mymodel/1/change/
admin_url_4: /admin/myapp/mymodel/1/change/
참고
- 이 예제는 Django 5.0을 기반으로 합니다.
- 모델 이름, 앱 레이블 및 URL 이름은 사용자 지정해야 합니다.
Django에서 객체의 관리자 URL 가져오는 대체 방법
ModelAdmin 클래스 사용
ModelAdmin
클래스의 get_urls()
메서드를 사용하여 모델 관리자 URL을 직접 정의할 수 있습니다.
from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super().get_urls()
custom_urls = [
url(r'^my-custom-url/$', self.my_custom_view),
]
return urls + custom_urls
admin.site.register(MyModel, MyModelAdmin)
이 코드는 /admin/myapp/mymodel/my-custom-url/
URL에 액세스할 때 my_custom_view()
함수를 호출합니다.
urlresolvers 모듈 사용
django.urls.resolvers
모듈에서 제공하는 get_resolver()
함수를 사용하여 URL 리졸버를 가져올 수 있습니다.
from django.urls import get_resolver
resolver = get_resolver()
url_pattern = resolver.url_patterns[0]
# URL 패턴을 사용하여 URL을 생성합니다.
admin_url = url_pattern.reverse('admin:{app_label}_{model_name}_change', args=(obj.pk,))
직접 URL 문자열 조합
다음과 같이 직접 URL 문자열을 조합하여 관리자 URL을 만들 수도 있습니다.
admin_url = f'/admin/{app_label}/{model_name}/{obj.pk}/change/'
주의 사항
- 직접 URL 문자열을 조합하는 방법은 유연하지만 오류 가능성이 높습니다.
ModelAdmin
클래스를 사용하는 방법은 가장 확장 가능하고 유지 관리하기 쉬운 방법입니다.
참고 자료
django django-admin django-urls