티스토리 뷰

728x90

 

이제 관리 페이지에 표시되는 내용을 조금 더 보기 좋게 수정하는 것을 진행해 보겠습니다.

기존에 catalog/admin.py에 등록했던 코드를 지우거나 주석처리합니다.

아래와 같이 관리자 class를 만들고 관리자 class를 등록합니다.

class AuthorAdmin(admin.ModelAdmin):
    pass

class BookAdmin(admin.ModelAdmin):
    pass

class BookInstanceAdmin(admin.ModelAdmin):
    pass

admin.site.register(Author, AuthorAdmin)
admin.site.register(BookInstance, BookInstanceAdmin)
 

각 관리자 class에 list view에 무엇을 표시할 지 정의합니다.

한 가지 주의할 점은 Book의 Field 중 genre는 ManyToMany 타입입니다.

그래서 list view에 표시하면 성능이 안 좋아집니다.

그래서 표시하기 위한 함수를 정의해야 합니다.

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name','first_name','date_of_birth','date_of_death')

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','author','display_genre')

class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('status','due_back')
 

catalog/models.py에서 Book class 안에 display_genre라는 함수를 추가합니다.

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
    summary = models.TextField(max_length=1000, help_text='Enter a brief description of the book')
    isbn = models.CharField('ISBN', max_length=13, help_text='13 Character ISBN number')
    genre = models.ManyToManyField(Genre, help_text='Select a genre for this book')

    def display_genre(self):
        return ', '.join(genre.name for genre in self.genre.all()[:3])

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('book-detail', args=[str(self.id)])
 

다 수정했다면 migration과 서버를 실행합니다.

admin페이지로 접속해서 장르 페이지로 이동하면 아래와 같이 수정한 field로 표시되는 것을 확인할 수 있습니다.

그리고 한가지 확인할 수 있는 내용이 다른 field와 다르게 이름을 정의했던 date_of_dead field는 정의한 이름으로 표시되는 것을 확인할 수 있습니다.

book 페이지로 이동하면 정의한 field로 표시되는 것을 확인할 수 있습니다.

그리고 Genre는 설정한 것과 같이 최대 3개까지만 표시되는 것을 확인할 수 있습니다. (예제에서 저는 4개의 장르를 선택했습니다.)

이번에는 detail 화면을 수정하는 것을 진행할 것입니다.

BooksInstanceInline class가 추가되었습니다.

fields가 추가되었습니다.

fieldsets가 추가되었습니다.

class BooksInstanceInline(admin.TabularInline):
    model = BookInstance

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name','first_name','date_of_birth','date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','author','display_genre')
    inlines = [BooksInstanceInline]

class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book','status','due_back','id')
    fieldsets = (
        (None, {
            'fields': ('book','imprint','id')
        }),
        ('Availability', {
            'fields': ('status','due_back')
        }),
    )

admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)
admin.site.register(BookInstance, BookInstanceAdmin)
 

일단 적용한 후 Authors 페이지로 가서 저자 하나를 선택합니다.

그러면 표시되는 순서가 fields에 정의한 순서대로 표시되는 것을 확인할 수 있습니다.

그리고 튜플로 정의한 것은 가로로 나란히 표시되는 것을 확인할 수 있습니다.

BookInstance 도 수정 페이지로 들어가봅니다.

그러면 fieldsets에 정의한 순서대로 나오고 있으며

2개로 구분해서 표시되는 것을 확인할 수 있습니다.

Book 수정 페이지도 접속합니다.

그러면 Book 수정 항목 밑에 BookInstance도 같이 표시되는 것을 확인할 수 있습니다.

 

이제 list view에 filter를 추가하는 법을 실습할 것입니다.

BookInstance class에 list_filter를 추가하였습니다.

class BooksInstanceInline(admin.TabularInline):
    model = BookInstance

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name','first_name','date_of_birth','date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','author','display_genre')
    inlines = [BooksInstanceInline]

class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book','status','due_back','id')
    list_filter = ('status','due_back')
    fieldsets = (
        (None, {
            'fields': ('book','imprint','id')
        }),
        ('Availability', {
            'fields': ('status','due_back')
        }),
    )

admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)
admin.site.register(BookInstance, BookInstanceAdmin)
 

접속해서 확인하면 아래와 같이 우측에 filter가 추가된 것을 확인할 수 있습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함