erp 도전

일괄 수정 구현1) : 한 페이지에 멀티폼 구현

나도초딩 2023. 5. 4.

장고에 상당히 회의감이 들었던 시간이였다.

ERP , 관리자단에서 가장 핵심적인 부분이, 자유로운 일괄 수정인데....

# 멀티 폼 사용

  1. POST 방식으로 전달 된 값을 구분해서 받는다. 템플릿 파일에서 submit 에 name 값을 주고, view 에서 name 으로 구분한다.
<button type="submit" class="btn btn-warning" name="chk_modify">수정</button>

views.py

if 'search' in request.POST:
if 'chk_delete' in request.POST:
if 'chk_modify' in request.POST:

# getlist() 로 checkbox 값 읽어오기

if 'chk_delete' in request.POST:
chk_pk_list = request.POST.getlist('chk_pk', None)

# 읽어온 pk 리스트 int 로 변환하기 : map(함수, 적용할 리스트)

chk_pk_list = request.POST.getlist('chk_pk', None)
# //TODO: int로 변환
chk_pk_list = list(map(int, chk_pk_list))

# 3항 연산

chk_iti=1 if chk_iti=='1' else 0

너무 초보틱해서 3항연산으로 검색해봤다.

            # if (chk_iti == '1'):
            #     chk_iti = 1
            # else:
            #     chk_iti = 0

# 업데이트 방법 개선. bulk_update

            for i, item in enumerate(chk_pk_list):
                print(i, item)
                Item = TourItem.objects.get(id=item)
                # Item.share_air_chk = chk_air_list[i]
                Item.share_iti_chk = chk_iti
                Item.share_air_chk = chk_air
                Item.save()

코드가 한 줄로 끝났다. 이건 좀 멋지다.

TourItem.objects.filter(id__in=chk_pk_list).update(share_iti_chk=chk_iti, share_air_chk=chk_air)

filter(id__in=[0,1,2,3.....])

 

# CBV 에서 redirect

return render()

return redirect('tour:item_lv')

return reverse('tour:item_lv') ... 이건 오류 발생하는데, 아후 헷갈려. 

 

 

하면 할수록 어렵다... 아호...

거의 다 온 것 같긴 한데... 시간이 오래 걸려도 해결하긴 하니까... ㅠ

체크 일괄 삭제, 수정은 # form.is_valid() 초이스 필드 관련 학습 후, cleand_data 로 사용해야한다.

여기까지 꾸역꾸역 구연한 게 어디냐...

이렇게 어려울 줄은 몰랐어.. .증말 증말... 아홍

 

# 그런데, getlist() 와 cleaned_form() 적용?

하루종일 검색해보다 실패했다.

지원 안된다는 글을 몇 개 봤다.

그리고, formview 부분을 좀 진지하게 공부해야겠다. 하다보면 알아지겠거니 했지만...아니였어. 굉장히 심오하다. ㅠ

forms.form 과 forms.modelform이 다르다...

initial 속성과 choicefield 등... 아호 무지 무지 복잡타.

 

하튼... 아호 힘들다.

정말 책으로 보는 것과 프로젝트를 해보는 거는 정말 하늘과 땅 차이로다..

 


class TourItemTable(ListView):
    model = TourItem

    basiccode = BasicCode.objects.all()

    #template_name = "tour/tour_item_list_3.html"
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data()
        context['form'] = SearchForm
        context['basiccode'] = self.basiccode
        
        return context
        
    def post(self, request, *args, **kwargs):
        if 'search' in request.POST:
            form = SearchForm(request.POST)

            if form.is_valid():
            .....
            
            
            context = {
                'form':form,
                'day_list2':day_list2,
                'object_list':tour_item,
                'basiccode': self.basiccode,
            }
        return render(request, self.template_name, context)
        
        if 'chk_delete' in request.POST:
            chk_pk_list = request.POST.getlist('chk_pk', None)
        # form.is_valid() 초이스 필드 관련 학습 후, 변경하기
            chk_pk_list = list(map(int, chk_pk_list))
            for item in chk_pk_list:
                TourItem.objects.filter(id=item).delete()
            # reverse 사용하니, httpresponse 반환해야한다며 오류 발생. redirect 나 render 사용해야함
            return redirect('/tour/item_lv/')
            
            
        if 'chk_modify' in request.POST:
            chk_pk_list = request.POST.getlist('chk_pk', None)
            
            chk_iti = request.POST.get('iti_check', None
            chk_air = request.POST.get('air_check', None)
            
            # chk_iti = 1 if chk_iti == '1' else chk_iti = 0 3항 연산 에러!!
            chk_iti = 1 if chk_iti == '1' else 0
                

            if (chk_air == '1'):
                chk_air = 1
            else:
                chk_air = 0

            TourItem.objects.filter(id__in=chk_pk_list).update(share_iti_chk=chk_iti, share_air_chk=chk_air)

댓글