파이썬 장고의 관리자(Admin) 인터페이스를 커스터마이징하는 방법은?
_____A1: `admin.py` 파일에서 커스터마이징 작업을 합니다. 해당 앱 폴더 내에 위치하며, 여기서 모델에 대한 `ModelAdmin` 클래스를 정의하고 등록할 수 있습니다.
---
Q2: 관리자 페이지에 표시할 모델 필드를 지정하려면 어떻게 해야 하나요?
A2: `ModelAdmin` 클래스에서 `list_display` 속성을 정의하면 됩니다. 예를 들어:
```python
class MyModelAdmin(admin.ModelAdmin):
list_display = ('field1', 'field2', 'field3')
```
---
Q3: 관리자의 검색 기능을 추가하거나 수정하려면?
A3: `search_fields` 속성에 검색할 필드명을 튜플이나 리스트로 지정합니다.
```python
class MyModelAdmin(admin.ModelAdmin):
search_fields = ('name', 'email')
```
---
Q4: 필터 사이드바를 추가하고 싶을 때는 어떻게 하나요?
A4: `list_filter` 속성에 필터링할 필드명을 지정합니다.
```python
class MyModelAdmin(admin.ModelAdmin):
list_filter = ('status', 'created_at')
```
---
Q5: 관리자 폼에서 필드의 순서나 그룹을 변경하려면?
A5: `fields` 또는 `fieldsets` 속성을 사용합니다.
- `fields`: 필드 순서 지정
```python
fields = ('field1', 'field2', 'field3')
```
- `fieldsets`: 필드를 그룹핑하고 제목 붙이기
```python
fieldsets = (
('기본 정보', {'fields': ('field1', 'field2')}),
('추가 정보', {'fields': ('field3',)}),
)
```
---
Q6: 관리자 폼에 커스텀 폼을 적용하려면?
A6: `form` 속성에 사용자 정의 `forms.ModelForm` 클래스를 지정합니다.
```python
from django import forms
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = '__all__'
def clean_field1(self):
커스텀 유효성 검사
pass
class MyModelAdmin(admin.ModelAdmin):
form = MyModelForm
```
---
Q7: 관리자 리스트에 커스텀 컬럼을 추가할 수 있나요?
A7: 네, `list_display`에 메서드 이름이나 속성을 추가하고 해당 메서드를 `ModelAdmin` 내에 정의하면 됩니다.
```python
class MyModelAdmin(admin.ModelAdmin):
list_display = ('field1', 'custom_column')
def custom_column(self, obj):
return obj.field2 + " 추가 정보"
custom_column.short_description = '맞춤 정보' 컬럼 헤더명 지정
```
---
Q8: 특정 필드를 읽기 전용으로 만들 수 있나요?
A8: 네, `readonly_fields` 속성에 필드명을 넣으면 수정 불가능한 읽기 전용 필드가 됩니다.
```python
readonly_fields = ('created_at', 'updated_at')
```
---
Q9: 관리자 인터페이스의 버튼이나 액션을 추가하려면 어떻게 해야 하나요?
A9:
- 리스트 화면의 액션: `actions` 속성으로 커스텀 액션 메서드를 등록합니다.
```python
def make_published(modeladmin, request, queryset):
queryset.update(status='published')
make_published.short_description = "선택 항목을 공개 상태로 변경"
class MyModelAdmin(admin.ModelAdmin):
actions = [make_published]
```
- 객체 상세페이지에 커스텀 버튼 추가는 Django의 기본 관리자에선 직접 지원하지 않지만, 템플릿 오버라이딩이나 `change_form_template`을 사용해 가능하며, JavaScript 추가 등의 고급 커스터마이징이 필요합니다.
---
Q10: 관리자 인터페이스 전반의 템플릿을 수정할 수 있나요?
A10: 네. 관리자 템플릿은 `django/contrib/admin/templates/admin/` 아래에 위치합니다. 이 템플릿을 앱이나 프로젝트 내의 동일 경로에 복사해서 필요한 부분을 수정하면 기본 템플릿이 덮어써집니다. 주요 템플릿:
- `change_list.html` (리스트 페이지)
- `change_form.html` (객체 상세/수정 페이지)
- `base_site.html` (관리자 기본 레이아웃)
---
Q11: 관리자 인터페이스의 CSS나 JS를 추가하거나 변경하는 방법은?
A11: `ModelAdmin` 클래스에서 `Media` 내부 클래스를 정의해 커스텀 CSS/JS를 추가할 수 있습니다.
```python
class MyModelAdmin(admin.ModelAdmin):
class Media:
css = {
'all': ('css/custom_admin.css',)
}
js = ('js/custom_admin.js',)
```
---
Q12: 관리자에서 다대다(many-to-many) 필드의 위젯을 변경할 수 있나요?
A12: `formfield_overrides`를 사용하거나, 폼을 직접 만들어 위젯을 지정할 수 있습니다. 예:
```python
from django.forms import CheckboxSelectMultiple
from django.db import models
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.ManyToManyField: {'widget': CheckboxSelectMultiple},
}
```
---
Q13: 관리자의 관리자 권한 별로 표시할 필드나 기능을 다르게 할 수 있나요?
A13: 가능합니다. `ModelAdmin` 클래스 내에서 메서드 오버라이딩으로 구현합니다.
예:
- `get_queryset(self, request)` : 보여줄 데이터 제한
- `get_fields(self, request, obj=None)`: 보여줄 필드 선택
- `has_add_permission(self, request)`, `has_change_permission(self, request, obj=None)`, `has_delete_permission(self, request, obj=None)`: 권한에 따라 조절
- `get_readonly_fields(self, request, obj=None)`: 읽기 전용 필드 결정
---
Q14: 관리자 페이지에 인라인(inline) 모델을 추가하는 방법은?
A14: 인라인 클래스를 작성해 부모 모델의 `ModelAdmin`에 등록합니다. 예:
```python
from django.contrib import admin
class ChildModelInline(admin.TabularInline): or admin.StackedInline
model = ChildModel
extra = 1 빈 폼 수
class ParentModelAdmin(admin.ModelAdmin):
inlines = [ChildModelInline]
```
---
Q15: 관리자 사이트 제목이나 헤더를 변경할 수 있나요?
A15: `admin.site.site_header`, `admin.site.site_title`, `admin.site.index_title` 속성으로 변경합니다.
```python
admin.site.site_header = "나의 관리자 페이지"
admin.site.site_title = "관리자 타이틀"
admin.site.index_title = "관리자 메인"
```
---
이처럼 다양한 설정, 메서드 오버라이딩, 템플릿 커스터마이징 및 CSS/JS 추가를 통해 Django 관리자 인터페이스를 자유롭게 맞춤 설정할 수 있습니다.
기본적으로 제공되는 기능 외에도, Django의 관리자 인터페이스를 커스터마이징하여 더 나은 사용자 경험을 제공할 수 있습니다.
아래에서는 Django 관리자 인터페이스를 커스터마이징하는 몇 가지 방법을 소개합니다.
1. 관리자 클래스(Custom Admin Class) 정의하기Django의 관리자 인터페이스는 모델에 대한 관리자 클래스를 통해 커스터마이징할 수 있습니다.
`admin.ModelAdmin` 클래스를 상속받아 자신만의 관리자 클래스를 정의할 수 있습니다.
```pythonfrom django.contrib import adminfrom .models import MyModelclass MyModelAdmin(admin.ModelAdmin): list_display = ('field1', 'field2', 'field3') # 리스트에 표시할 필드 search_fields = ('field1', 'field2') # 검색 필드 list_filter = ('field3',) # 필터링 옵션admin.site.register(MyModel, MyModelAdmin)```
2. 필드 및 폼 커스터마이징필드의 순서나 레이아웃을 변경하고 싶다면 `fieldsets` 속성을 사용할 수 있습니다.
이를 통해 필드를 그룹화하고 레이아웃을 조정할 수 있습니다.
```pythonclass MyModelAdmin(admin.ModelAdmin): fieldsets = ( (None, { 'fields': ('field1', 'field2') }), ('Advanced options', { 'classes': ('collapse',), 'fields': ('field3',), }), )```
3. 인라인 모델 관리하기모델 간의 관계가 있을 때, 인라인 모델을 사용하여 관련된 모델을 한 페이지에서 관리할 수 있습니다.
```pythonfrom django.contrib import adminfrom .models import ParentModel, ChildModelclass ChildModelInline(admin.TabularInline): model = ChildModel extra = 1 # 추가할 빈 폼의 수class ParentModelAdmin(admin.ModelAdmin): inlines = [ChildModelInline]admin.site.register(ParentModel, ParentModelAdmin)```
4. 사용자 정의 액션 추가하기관리자 인터페이스에서 여러 개의 객체를 선택하고 특정 작업을 수행할 수 있는 사용자 정의 액션을 추가할 수 있습니다.
```pythondef make_published(modeladmin, request, queryset): queryset.update(status='published')make_published.short_description = "Mark selected stories as published"class MyModelAdmin(admin.ModelAdmin): actions = [make_published]```
5. 관리자 템플릿 커스터마이징Django의 관리자 인터페이스는 기본적으로 제공되는 템플릿을 사용합니다.
필요에 따라 템플릿을 오버라이드하여 디자인을 변경할 수 있습니다.
템플릿 파일은 `templates/admin/` 디렉토리에 위치해야 합니다.
6. CSS 및 JavaScript 추가하기관리자 페이지에 추가적인 CSS나 JavaScript 파일을 포함시킬 수 있습니다.
이를 통해 관리자 인터페이스의 스타일이나 기능을 더욱 향상시킬 수 있습니다.
```pythonclass MyModelAdmin(admin.ModelAdmin): class Media: css = { 'all': ('myapp/css/custom.css',) } js = ('myapp/js/custom.js',)```
7. 사용자 권한 및 접근 제어Django의 권한 시스템을 활용하여 특정 사용자나 그룹에게 관리자 인터페이스의 접근을 제한할 수 있습니다.
이를 통해 보안성을 높일 수 있습니다.
```pythonclass MyModelAdmin(admin.ModelAdmin): def has_change_permission(self, request, obj=None): return request.user.is_superuser # 슈퍼유저만 수정 가능``` 결론Django의 관리자 인터페이스는 기본적으로 제공되는 기능이 매우 강력하지만, 필요에 따라 다양한 방법으로 커스터마이징할 수 있습니다.
위에서 소개한 방법들을 통해 자신만의 관리자 인터페이스를 만들어 보세요.
이를 통해 데이터 관리의 효율성을 높이고, 사용자 경험을 개선할 수 있습니다.
작성자:
ㅁㅁ [비회원]
| 작성일자: 1년 전
2024-08-26 08:17:56
조회수: 186 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 186 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.