Django 쇼핑몰 만들기-4

Sang Jun Park·2021년 1월 19일
0

포트폴리오-STREET

목록 보기
4/6
post-thumbnail

게으른 과거의 나를 미워하며 과거의 한 일을 다시 복기해서 쓰는 내용(2)


오늘 한 일

1. productapp을 만들고 models.py를 작성함
개인적으로 쇼핑몰을 만들어보는건 처음이라 Model을 정의하는 작업이 너무 어려웠다..
우선, 오픈마캣이 아닌 개인 쇼핑몰을 구상중이기에 판매자는 admin이다.

  • 상품쪽 ERD
    • 상품 관련
      1. 상품은 카테고리를 참조함 (카테고리 1:N 상품)
      2. 상품은 여러개의 썸네일을 가질 수 있음 (상품 1:N 썸네일)
      3. 상품은 여러개의 상세 이미지를 가질 수 있음 (상품 1:N 상세이미지)
      4. 상품은 여러개의 옵션을 가질 수 있음 (상품 1:N 옵션)
    • 카테고리 관련
      1. 카테고리는 models.foreignkey('self')를 통해 계층구조를 가짐
    • 상품 옵션 관련
      1. 상품 옵션은 하나의 레코드에 상위 옵션과 하위 옵션을 가짐
        ex) 상위 옵션 : 색상, 하위 옵션 : 블랙;화이트;그레이...

2. ProductCategory의 Create를 구현함

  • product Create를 구현하기 위해 먼저 ProductCategory의 Create를 구현했다.
    위의 ERD 설명 부분처럼 카테고리는 foreignkey()의 'self'를 줘서 계층구조를 갖는데 이를 통해 대분류, 중분류, 소분류로 카테고리를 작성할 수 있다.

3. Product의 Create를 구현함

  • django-multi-form-view를 통해 다중 모델, 다중 form을 처리하는 view를 구현했다.
    하나의 페이지에서 여러 폼을 가져와 Create로직을 처리하는 방법에 대해 한동안 고민했는데, 템플릿 페이지 안에서 {% include %}를 통해 그냥 페이지만 끌어와 하려다
    이렇게 하면 각각 model과 form에 대한 CreateView를 작성해야 할거같아 다른 방법을 찾던중 django-multi-form-view 패키지를 설치해 구현하게 되었다.
    (패키지에 의존하면 나약한 개발자가 될거같아 이것도 마음에 걸렸으나, 패키지를 잘 쓰는것도 실력이리라 믿기로 했따...)

productapp/views.py


@method_decorator(CHECK_AUTHENTICATION, 'dispatch')
class ProductCreateView(MultiFormView):
    form_classes = {'ProductCreationForm': ProductCreationForm,
                    'ProductThumbnailCreationForm': ProductThumbnailCreationForm,
                    'ProductDetailImageCreationForm': ProductDetailImageCreationForm}

    template_name = 'productapp/create/product_create.html'
    success_url = reverse_lazy('storeapp:index')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['category_list'] = json.dumps(list(ProductCategory.objects.select_related().all().values()),
                                              ensure_ascii=False)
        return context

    def forms_valid(self, forms):
        product = forms['ProductCreationForm'].save(commit=False)
        thumb_list = self.request.FILES.getlist('p_thumbnail', None)
        detail_list = self.request.FILES.getlist('p_detail_image', None)

        category_form = ProductCategoryCreationForm({'category_parent': self.request.POST.get('category_parent'),
                                                     'category_name': self.request.POST.get('category_name')})

        if category_form.is_valid():  # category form 유효성 체크
            category = category_form.save()

            product.product_category = category
            product.save()

        if thumb_list:  # 썸네일 저장
            for thumb_image in thumb_list:
                new_thumb = ProductThumbnailImage()
                new_thumb.p_target_product_id = product
                new_thumb.p_thumbnail = thumb_image
                new_thumb.save()

        if detail_list:  # 제품 상세 이미지 저장
            for detail_image in detail_list:
                new_detail_image = ProductDetailImage()
                new_detail_image.p_target_product_id = product
                new_detail_image.p_detail_image = detail_image
                new_detail_image.save()

        return super(ProductCreateView, self).forms_valid(forms)

오늘 알게된 내용

1. django-multi-form-view를 알게 되었고 적용했다!

해당 패키지의 github

  • view가 너무 길어질거같아 패키지를 설치해 하나의 view에서 다중 form을 처리하게 만들었다. 해당 클래스의 form_classes 필드에 dict 타입으로 form들을 넣어주면 template_name에 설정한 template문서에 form들을 넘겨준다.
    다시 POST로 넘어온 데이터들을 forms_valid()를 통해 한번에 validation check를 할 수 있다!! (단, 이게 어떻게 굴러가는지 좀 더 알아보면 좋을듯)

고민해야할 부분

1. 카테고리 계층구조의 최대 참조 가능 수를 설정할 방법을 찾지 못함

  • 계층구조에서 나는 최대 3단계를 원하는데 지금 구현된 코드는 무한하다..
profile
Django 개발자가 되고싶은 사람

0개의 댓글