erp 도전

일정표 구현 3: 조/중/석 구분값으로 저장, 사용하기

나도초딩 2023. 4. 25.

* 미션

일정표 관련 기능을 구현하면서, 자잘한 데이터를 사용할 일이 많아지게 됐다.

예를 들어, 다단 박스 형태에서, 조식, 중식, 석식이라면, 1일차에 조식/중식/석식이 들어가면 되는거다.

구체화

현재 출발일 상품(touritem)의 일정표(iti) 를 보여준다.

단, 일정표(iti) 모델의 food 필드는 '조식;중식;석식' 처럼 세미콜론으로 구분해서 저장돼 있다.

 

* 구분값으로 저장

구분값을 사용해서, 한 필드에 여러값 저장하고,

  • 문자열을 입력 받을 때, join 함수로 ; 으로 연결해서 저장하기. (이 때, strip 으로 공백을 제거하자.)

 

 

꺼내서 사용하기.

복잡타 ㅠㅠ 이거 밤까먹는거냐.

1. 원래 간단히, 댓글 모델을 생각했었다.

템플릿에서 바로 프로세싱하는 거였다.

{% if touritem.iti_set.exists %}
{% for iti in touritem.iti_set.iterator %}

이게 문제는 없었는데, 한 필드에 구분기호로 분리해서 사용하는 경우엔 맞지 않았다!

왜냐하면, 꺼낼 때 (split) , 저장할 때 (join) 등 템플릿 필터로는 문제가 생기기 때문이다.

  • 즉, 쉽게 하려면, 구분기호로 저장하는 필드를 사용하지 않던가.
  • view에서 처리하든가

 

2.  view에서 _set 을 이용한 역참조 조회 -> split 으로 (리스트화) --> context 오버라이딩 -> 템플릿에서 2중 for in 사용

class TourItemDetail(DetailView):
    model = TourItem
    template_name = "tour/tour_item_detail.html"
    
    def get_context_data(self, **kwargs):
        context = super(TourItemDetail, self).get_context_data()
        itis = self.object.iti_set.all()
        for iti in itis:
            f_list = iti.food.split(';') # 잘라서, 리스트로 변환
            iti.food = f_list #객체를 db에 save()하지 않고, context 오버라이딩용
        context['itis'] = itis
        context['iti_form'] = ItiForm
        return context

템플릿에서

{{object.itis}}
{% for iti in itis %}
    <p>    
        {{iti.day}}일차, {{iti.city}}, {{iti.trans}}
        {% for f in iti.food %}
        <br> {{f}}
    
        {% endfor %}
    </p>
{% endfor %}

끙. 기본기 부족으로 view 에서 처리하려고 해도, 오래 걸렸어. ㅠㅠ 아씽. 이 간단한걸 왜 이리 오래 걸린거냐.

 

 

2. 템플릿태그 사용 방법도 있긴한데, 으응... 머 좋은지 모르겠는걸?

가급적 장고만을 위한 기술이나 라이브러리, 커스터마이징은 쓰지 않도록 하려고 한다.

익히는데도 오래 걸리고, 자주 사용하고, 응용 가능한 스킬이어야 하는데, 그렇지 않은 것이 많아서.

장고의 기본 기능, 파이썬, 자바스크립트로 채우는 방식으로 가는게 좋겠다.

 

기본도 모르는데, 이걸 쉽게하려고 누가 만들어놓은 커스텀을 사용하면 실력이 늘겠나? 1회성 시간 낭비니, 기본 위주로 하고, 안되는건 쉽게 처리하고 쭉쭉 넘어가자.

 

https://stackoverflow.com/questions/63735047/django-template-split-a-string-in-two-parts

from django import template
register = template.Library()

@register.filter
def split(splitable, split_at):
    # split with max limit
    if len(split_at.split("||||")) == 2:
        return splitable.split(split_at.split("||||")[0], int(split_at.split("||||")[1]))
    
    # normal split without max limitation
    return splitable.split(split_at)

재 시작

{% load split %}

<!-- first element no split limit -->
{{ str1|split:"-"|first }}

<!-- first element with split limit, in following example, the limit is 1 -->
{{ str1|split:"-||||1"|first }}

<!-- last element no split limit -->
{{ str1|split:"-"|last }}

<!-- last element with split limit, in following example, the limit is 1 -->
{{ str1|split:"-||||1"|last }}

<!-- element by index no split limit -->
{% with str1|split:"-" as split_data %}{{ split_data.0 }}{% endwith %}

<!-- element by index with split limit, in following example, the limit is 1 -->
{% with str1|split:"-||||1" as split_data %}{{ split_data.0 }}{% endwith %}

담에 한번 해봐야지.. 아 지친다

{% load split %}
{% with form.instance.skills|split:"," as skills %}
    {% for skill in skills %}
        {{ skill }}
    {% endfor %}
{% endwith %}

 

댓글