(Django) 선택 및 다중 선택

지금 진행하고 있는 프로젝트는 분류가 많이 필요해서 초이스 분야에 대해 많이 배웠습니다.

Django 모델에는 별도의 선택 상자가 없습니다.

대신 문자 필드를 설정하십시오. choice=선택할 카테고리조정하면 됩니다

from django.db import models

DATE_CHOICES=(
    ('plan','plan'),
    ('progress','progress'),
    ('end','end')
)

class Post(models.Model):
    ```
    date_category=models.CharField(choices=DATE_CHOICES, max_length=50) 
    ```

    def __str__(self):
        return f'({self.pk}){self.title} :: {self.user}'

이렇게… 할 수 있습니다.


admin.py

그런데 json 형식으로 전달해야 하니까… 시리얼라이저도 만들어야지!

직렬 변환기는 선택 상자를 제공합니다.

다만, 모델=게시물로 받아서 따로 쓸 필요는 없었습니다.

당신이 할 경우 date_category=models.ChoiceField(choices=DATE_CHOICES, max_length=50)당신은 이렇게해야합니다


허용된


이 시간 다중 선택해봐

혹시라도 Django의 기본 모델에는 그러한 필드가 없습니다.

Serializer 모델에 Mutiplechoice가 존재하는데 Django의 Charfield로 저장하려고 하니 제대로 저장이 되지 않았습니다.

다중 선택을 하려면 새 모델 라이브러리를 다운로드해야 합니다.

pip 설치 django-multiselectfield

하지만 문제가 있습니다!
!
!

이 라이브러리는 Python3.4+, Django 2.0+까지만 지원하므로 이 필드를 사용하려면 먼저 Django를 강등하세요!
!
!

많이 만들었어요… 이 라이브러리를 사용하지 않았어요. 그래도 글 쓰는 날을 위해… 새 폴더에서 연습했어요.

실행 후 pip install django==2.0 위와 같이 설치하고 설정 설치 프로그램에 설치합니다.

‘다중 선택 필드’그렇습니다

from django.db import models
from multiselectfield import MultiSelectField

MY_CHOICES=(
    ('jobseeker','jobseeker'),
    ('license','license'),
    ('exam','exam'),
    ('gradschool','gradschool')
)

class Post(models.Model):
    my_category=MultiSelectField(choices=MY_CHOICES, max_length=16, max_choices=3)


    def __str__(self):
        return f'({self.pk})'

임시로 생성된 models.py!


max_choices

max_choices도 잘 설정되어 있습니다.

max_length와 max_choices 제약이 2개 있어서 그렇게 보이지만 3개 이하의 선택 제약이 잘 적용됩니다.

여기서 또 다른 문제가 발생했습니다.

Serializer는 multiselectfield를 별도로 제공하지만 max_choices와 같은 옵션은 없습니다.

따라서 drf에 의해 값이 전달되면 선택한 모든 값이 제한 없이 데이터베이스에 입력됩니다.


그렇게..

나는 매우 걱정했다.

뷰에서 my_category의 개수를 세고, 한도를 초과하면 저장을 할 수 없습니다…

값을 전혀 전달할 수 없도록 전면의 선택을 제한할 수 없습니까?

이전 프로젝트에서 이 작업을 수행한 것 같습니다…

찾아보니 js로 가능하네요.

var limit = 3;
$('input.single-checkbox').on('change', function(evt) {
   if($(this).siblings(':checked').length >= limit) {
       this.checked = false;
   }
})

뒤에서 풀 수 있으면 좋겠지만.. 앞에서 풀 수 있으니 잠궈야 할 것 같아요~


공식 문서

https://www.django-rest-framework.org/api-guide/fields/#choicefield

Serializer 필드 – Django REST 프레임워크

www.django-rest-framework.org