지금 진행하고 있는 프로젝트는 분류가 많이 필요해서 초이스 분야에 대해 많이 배웠습니다.
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}'
이렇게… 할 수 있습니다.
그런데 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_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