무효 클릭 IP 추적 중...
파이썬/django(장고)

[장고 기초] choices를 통한 드롭 다운 메뉴 만들기

꼬예 2021. 8. 5.

이번 포스팅에서는 드롭 다운 메뉴 형태로 값을 넣는 방법에 대해 알아보도록 하겠습니다.

 

우선 아래와 같이 choices에 넣을 인자로 튜플로 이루어진 튜플을 만듭니다.

BRAND_CHOICES = (
    ('MERCEDES', 'Mercedes'),
    ('TESLA', 'Tesla'),
    ('BMW', 'Bmw'),
    ('AUDI', 'Audi')
)

여기서 이상한점은 같은 값을 두개를 만들어 튜플을 만들었다는 것인데요. 이부분이 우리 직관에 많이 반하는 부분이죠..

 

본론부터 말하자면,

각 튜플의 1번째에 위치해 있는 값이 모델에서 내부적으로 받아들이는 값이고 2번째 위치해 있는 값은 우리가 드롭다운 메뉴에서 실제로 보게 될 글자라고 보시면 됩니다. 

두개의 값을 같게 해도 상관없지만, 우리는 실제로 각각의 값이 어떻게 동작하는지 알기 위해 다르게 적어보도록 하겠습니다.

 

 

이어서 Cars 라는 모델을 만듭니다.

class Cars(models.Model):
    brand = models.CharField(max_length= 200, choices = BRAND_CHOICES)
    model = models.CharField(max_length= 200)
    max_speed = models.PositiveIntegerField()
    country = models.CharField(max_length=200, blank=True)
    added = models.DateTimeField(auto_now_add=True)

보시다시피 우리가 드롭다운 메뉴를 적용할 필드는 brand이고, 해당 필드에 choices라는 이름으로 앞서 정의한 튜플 값을 넣습니다. 

 

 

실제로 값이 어떻게 들어가는지는 admin에 접속해서 확인해보죠

드롭다운 메뉴의 값들을 보면 첫 글자만 대문자 형태인걸 알 수 있습니다. 

BRAND_CHOICES 에서 정의한 튜플 두번째 값이 들어간것처럼 보이시죠?   

 

그렇다면 앞서 BRAND_CHOICES의 첫번째 값이 정말 모델에서 받아들이는 값인지 증명해볼 차례입니다.

 

앞서 적은 코드에 몇개의 함수를 추가 해보겠습니다. 

class Cars(models.Model):
    brand = models.CharField(max_length= 200, choices = BRAND_CHOICES)
    model = models.CharField(max_length= 200)
    max_speed = models.PositiveIntegerField()
    country = models.CharField(max_length=200, blank=True)
    added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return "{} - {} - {}".format(self.brand, self.model, self.country)

    def save(self, *args, **kwargs):
        if self.brand == 'TESLA':
            self.country = 'USA'
        else:
            self.country = 'GERMANY'
        super().save(*args,**kwargs)

__str__ 함수는 admin단에서 보이는 제목이 아래와 같이 보이기 때문에 우리가 원하는 형태로 뽑아주기 위한 코드입니다.  

 

 

변경 후에는, 아래와 같이 변경 됩니다.

자, 그러면 save() 함수는 무엇일까요?

해당 함수는 브랜드에 특정값이 들어가면 해당 조건에 맞는 값을 country 필드에 넣으라고 명령하는 코드입니다.

brand 필드에  TESLA 값이 전달되면 자동적으로 country필드에는 'USA'값을 넣으라는 것이죠.

 

실제 동작을 확인해보겠습니다.

아래와 같이 Brand 에 Tesla를 넣고 Country는 그냥 비워둔채로 저장해보겠습니다 .

 

다시 해당 인스턴스를 다시 확인해보면 비워둔 채로 저장한 Country 필드가 우리가 지정한 규칙에 따라 채워진걸 확인 할 수 있습니다. 

 

여기서 혹시 눈치 채신 분이 계실까요?

우리가 지정한 'TESLA' 는 앞서 BRAND_CHOICES에서 튜플의 첫번째 형태입니다. 즉 내부적으로는 첫번째 값을 받아들이다는것을 알 수 있죠.

 

 

정말 그런지는 이부분을 Tesla로 변경해보겠습니다.

 

마찬가지로 Tesla로 Brand를 지정하고 저장을 해보겠습니다.

 

 

결과를 보시면 'USA'가 아닌 'GERMANY'가 출력되는 것을 알 수 있죠..

다시 말하면 우리는 분명 드롭다운메뉴에서 Tesla로 지정을 했지만 모델 내부에는 그 값을 Tesla로 받아들이지 않습니다.

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글