관리 메뉴

Leo's Garage

Django #3 admin 기능 추가해보기 본문

Study/Django

Django #3 admin 기능 추가해보기

LeoBehindK 2022. 12. 28. 23:27
728x90
반응형

Django를 공부하면서 느낀 점 중 하나가 와 이런 것까지 된다고? 였다. 

사실 한 두 가지가 아니라 공부를 할 수록 정말 정교하고 다양하게 만들어졌다는 생각이 든다. 

 

혹자는 Python을 혹은 백엔드를 밑바닥부터 해보지 않고 Django부터 공부하면 성장에 한계가 올 수도 있다고 하던데 그 말이 맞는말 같다

그정도로 Django는 이 FrameWork 자체만으로 엄청난 파워를 가지고 있고 정말 손쉽게 다양한 기능을 추가할 수 있게 해준다. 

 

자 admin에 기능을 추가해보자

 

우선 기존에 user admin 창을 들어가보자. 

화면에서 보이는 것과 같이 Column이 존재하고, 오른쪽에는 Filter가 존재한다. 

또한 사용자 이름에는 실제 사용자의 이름이 들어가 있다. 

 

자 그러면 신규로 생성한 House라는 app의 admin 페이지를 들어가보자.

우선 User admin과 다른 점은 Column도 비어있고, Filter도 없으며, Search Bar도 없으며 데이터 이름 자체가 House Object(1) 이라는 형태로 나오고 있다. 

실제 데이터의 이름은 Hellow로 지었는데, 저렇게 나오는 것은 Class를 직접 Print 하는 경우 발생할 수 있다. 

class Dog:
  def __init__(self,name):
    self.name = name

jia = Dog("jia")
print(jia)

이런 경우, 

<__main__.Dog object at 0x7f0025de4640>

위와 같은 식으로 의도하지 않은 값이 나올 수 있다. 

이를 원하는 값으로 표출하도록 변경하는 것은 아래와 같다. 

Houese의 models.py에 아래 __str__ 함수를 추가한다. 

from django.db import models

# Create your models here.
class House(models.Model):
    
    """Model Definition for House"""
    name = models.CharField(max_length=140)
    price_per_night = models.PositiveIntegerField(verbose_name="Price", help_text="Positive Numbers Only")
    description = models.TextField()
    address = models.CharField(max_length=140)
    pets_allowed = models.BooleanField(
        verbose_name="Pets Allowed?",
        default=True, help_text="Does this house allow pets?")

    def __str__(self):
        return self.name

__str__ 함수는 class 객체를 print했을 때 동작하게 된다. 

위와 같이 객체에 name property로 반환하게 하였다. name은 그 위에 선언된 것과 같이 140 Length로 제한된 Char값이다.

이런게 변환하고 나면 아래와 같이 admin 페이지가 변경되게 된다. 

기대한 것과 같이 실제 이름이 나오게 된다. 

다음으로는 Column을 보이도록 설정해보겠다. 

Houses의 admin.py에서 아래와 같이 값을 추가해보자.

from django.contrib import admin
from .models import House

# Register your models here.
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
    
    list_display = (
        "name",
        "price_per_night",
        "address",
        "pets_allowed"
    )

기존에는 pass로 admin.ModelAdmin을 상속받기만 했었는데 해당 부분을 없에고 list_display속성을 추가하였다. 

상기와 같이 Column에 값이 들어가는 것을 확인할 수 있다. 

자 이번에는 패널의 오른쪽에 Filter를 넣어보자 

from django.contrib import admin
from .models import House

# Register your models here.
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
    
    list_display = (
        "name",
        "price_per_night",
        "address",
        "pets_allowed"
    )
    list_filter = ("price_per_night", "pets_allowed")

위와 같이 list_filter를 널어주고 원하는 property들을 적어준다. 

오른쪽에 Fitler기능이 생겼고, 클릭을 통해서 데이터들을 적절하게 sorting할 수 있게 된다. 

자 이번에는 특정 속성에는 Link를 구현하고, 특정 속성에게는 현재 화면에서 수정이 가능하도록 해보겠다. 

from django.contrib import admin
from .models import House

# Register your models here.
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
    
    list_display = (
        "name",
        "price_per_night",
        "address",
        "pets_allowed"
    )
    list_filter = ("price_per_night", "pets_allowed")
    search_fields = ("address",)
    list_display_links = ("name", "address")
    list_editable = ("pets_allowed",)

list_display_links는 현재 해당 속성의 값을 클릭 시, 편집화면으로 들어갈 수 있게 하는 기능이다.

list_editable은 편집화면을 들어가지 않더라도 현재 화면에서 해당 속성을 수정할 수 있게 한다. 

name 뿐 아니라 address도 파란색으로 클릭 가능한 상태가 되었다. 

또한 pets_alllowed는 체크박스로 현재 화면에서 값을 변경할 수 있게 되었다. 

사실 이런 속성 외에도 Django에서 적절하게 사용하면 구현되는 기능이 정말 많다. 

모든 내용을 다룰 수는 없으니 더 궁금한 것들은 아래 Django 공식 Documents를 참조하도록 하자. 

 

https://docs.djangoproject.com/en/4.1/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

728x90
반응형

'Study > Django' 카테고리의 다른 글

Django #6 Make models more - 1  (0) 2023.01.02
Django #5 Users App custom -2  (0) 2023.01.02
Django #4 Users App custom -1  (0) 2022.12.30
Django #2 app 만들기  (0) 2022.12.28
Django #1 프로젝트 셋업 및 기본 동작 확인  (0) 2022.12.27
Comments