Django – modal 창에 form error 출력

Django model forms (https://github.com/trco/django-bootstrap-modal-forms/blob/master/README.rst) 이용하고 있는데, 모달 창이 뜬 상태에서 form submit 을 수행하고, 에러가 발생하면 해당 모달창에 바로 띄워주고 싶어서 시도!

원래 제공되는 기능인데, 그냥 쓴 방법을 정리해 둔다.

모달창 템플릿 코드는 아래와 유사하게 되어 있다. 여기서 div class=”invalid” 부분이 중요하다. 여기서 class invalid 부분을 빼 버리면, 모달창에 표시되는게 아니라 전체 페이지가 모달 창을 띄우는 페이지로 바뀌어 버려 브라우저 전체에 모달창 템플릿만 표기되는 문제가 있다.

<div class="modal-body">
        <div class="invalid mb-2">
          
        </div>
        
  </div>

설명이 어려워서 그림으로 남겨둔다.

![](assets/images/2023/02/3_image-1.png?ssl=1)

이렇게 표기되기를 원하는데, 빨간색 표기는 <p> 태그에 의해서 표기되는 것이라 div class invalid 를 빼고 실행했더니, 쩝 모달창이 사라지고 전체페이지를 잡아 먹는 모양새가 되버리네. class css 에 먼가가 정리되어 있나 보다.

![](assets/images/2023/02/image-2.png?ssl=1)

일단 그럼 에러를 띄워주는 부분의 코드는 아래를 참고

class ShippingProductUpdateForm(BSModalModelForm):
    title = ""
    # update_firmware_version = forms.CharField(label=_("업데이트버전"), widget=forms.TextInput(attrs={"readonly": True}))

    class Meta:
        model = ShippingProduct
        # fields = ["product", "serial", "status", "version", "update_firmware_version", "date_shipping", "shipping_company"]
        fields = ["product", "serial", "status", "date_shipping", "shipping_company"]
        labels = {
            "shipping_company": _("출고회사"),
            "product": _("*상품"),
            "serial": _("*시리얼"),
            "status": _("*상태"),
            "date_shipping": _("*출고일"),
        }
        widgets = {
            "shipping_company": forms.Select(attrs={"class": ""}),
            "product": forms.Select(attrs={"class": "", "placeholder": "상품"}),
            "serial": forms.TextInput(attrs={"class": ""}),
            "status": forms.Select(attrs={"class": ""}),
            "date_shipping": forms.DateInput(attrs={"type": "date", "required": True}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("ShippingProductUpdateForm init", self.request.user.profile.level, self.request.user.profile.company)
        self.title = "출고상품 수정"
        self.fields["product"].queryset = Product.objects.filter(company_id=self.request.user.profile.company, is_deleted=0)
        # if self.instance.update_firmware:
        #     self.fields["update_firmware_version"].initial = self.instance.update_firmware.version
        # else:
        #     self.fields["update_firmware_version"].initial = "No update"
        if self.request.user.is_superuser:
            self.fields["product"].label_from_instance = lambda obj: "%s (%s)" % (obj.name, obj.company.name)

    def clean(self):
        cd = self.cleaned_data
        print("ShippingProductUpdateForm", cd)
    # 에러발생 시키기 예제
        raise ValidationError(
            _("첨부파일을 입력하세요: %(value)s"),
            code="invalid",
            params={"value": cd.get("product")},
        )
        # return cd
  • clean 부분에 강제로 에러를 띄워 줬더니 잘 동작하는 것을 확인했다.

그리고, form submit 할 때 Validation check 를 미리 하지 않고 view, form function 에서 걸러내고 싶다면, 템플릿에서 아래와 같은 키워드를 submit 부분에 추가해 준다. formnovalidate="formnovalidate"

<button id="update" type="submit" formnovalidate="formnovalidate" >      

참고 사이트

서버리스 장고 – AWS Lambda framework 자료 조사

파이썬 기반의 서버리스 API 혹은 장고 platform을 구축할 수 있다는 Zappa! 관심 키워드로 두고 검색을 해보고 있음

서버 운용자 없이 그냥 코드만 관리하려면, 서버리스로 웹서버나 장고를 돌릴 수 있으면 베스트 인데, 소규모 스타트업 경우는 그냥 하나 띄워두고 자기 서비스에 집중할 수 있다니 한번 테스트 베드라도 구축해 두면 여러모로 도움이 될 듯!

그런데, 서버리스를 한다고 치자…Zappa 와 같은 또 쓰이게 되는 프레임워크의 필요성은 아래 글에서 참고하자. Zappa 대신 더 유명하다는 Serverless framework 사용기

Serverless

https://squarelab.co/blog/developing-internal-service-with-serverless-aws/

AWS Lambda + AWS API Gateway를 이용하여 직접 서버 인스턴스를 띄우지 않고서도 서버 기능을 할 수 있다는 사실은 많이 알려져 있습니다. 하지만 막상 이걸 직접 설정 해보려고 하면 해야할 일이 산더미 같습니다. 실제 코드를 작성해서 Lambda에 업로드해야하고, Lambda를 누가 실행 할 수 있는지 적당한 권한을 설정해줘야 하며, API Gateway와 Lambda를 연결해줘야하고, 사용자 지정 도메인도 연결해줘야하며, CloudWatch 로그 설정도 … (중략). 슬슬 오히려 EC2 인스턴스를 그냥 띄워서 하던대로 하는게 낫지 않을까 생각이 들기 시작하네요.

[
Serverless한 회사 내부 서비스 만들기
사내에서 사용되는 서비스의 경우 대중을 대상으로 하지 않기 때문에 사용량이 많지 않은 경우가 대부분입니다. AWS Lambda를 사용하면 비용 절감뿐만 아니라 서버를 직접 관리하고 운영할…
![](assets/images/2023/02/serverless-framework.jpg?ssl=1)
](https://squarelab.co/blog/developing-internal-service-with-serverless-aws/)

AWS 전용 프레임워크 – AWS Chalice 예제

Native python packaging 으로 아래 주소에 설명서가 있어요. 기왕 AWS 의존적이라면, 제공해주는 프레임워크를 쓰는 것도

[
Todo Application — AWS Chalice
![](assets/images/2023/02/architecture.jpg?ssl=1)
](https://aws.github.io/chalice/samples/todo-app/index.html)

단점

단점이라는 것을 한 번 살펴볼 필요가 있지만…암껏도 없는 소규모 서비스의 경우 백만건 도달할 수나 있나…

  1. vendor lock-in
    특정 vendor의 독자적 기술에 크게 의존한 제품, 서비스, 시스템 등을 채용했을 때 다른 vendor가 제공하는 동종 제품, 서비스, 시스템 등으로 갈아타기 어렵게 되는 현상

https://gnidoc.tistory.com/entry/AWS-Serverless-웹서비스-구축-경험-후기1탄
frontend는 react, backend는 django, DevOps는 terraform 등을 사용하여 최대한 오픈소스를 활용하여 vendor lock-in을 최대한 피했습니다

  • 누가 먼저 죽나…
  • Django 기반 프로젝트, Django template Frontend 구현
  • PostgreSQL 그냥 DB 사용 – 클라우드 플랫폼 의존성이 덜한

2. 기술 이전
쿠버네티스 이런걸 쓰고 싶다!!

[
쿠버네티스 ① 메인 K8s component (1)
인프라 내용을 학습할 때 항상 나오는 쿠버네티스…! 간단하게나마 알면 도움이 될 것같아 영상을 보고 학습하였다. 💪 학습 내용의 출처는 모두 아래 두영상이다! 🙌 참고한 영상 👇🏼 https://www.youtube.com..
![](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPorR%2FbtrN3MHnqUH%2FBoQNnEDaetDQ9AXMVx7AoK%2Fimg.png)
](https://dodop-blog.tistory.com/398)
  • 아직은…
  • 미래에도…
  • 이런 일이…

3. 운영에러
모르고 쓰게 되니깐 위험해…먼가 두려움이

https://www.megazone.com/techblog_20200424_opensource-24-open-source-tools-for-the-serverless-developer-part-1/

이러한 툴을 사용하여 프로비저닝을 자동화하기 전에 AWS에서 리소스를 프로비저닝하는 방법을 이해해야 합니다. 예를 들어 Serverless Framework 또는 AWS SAM 을 사용하는 경우 AWS CloudFormation의 작동 방식과 프레임워크의 기능을 이해해야 합니다. 툴이 작동하는 방식을 이해하지 않고 툴에 의존하게 되면 문제가 발생했을 때 이를 해결하는 방법을 모르기 때문에 위험합니다.
확실한 이해 없이 자동화해서는 안 됩니다.

참고 사이트

  • Zappa 찾아보게 된 계기
[
300원에 200만뷰 소화하기 – 서버리스 아키텍처 AWS 람다(Lambda) 활용 사례 – 로켓펀치 공식 블로그
로켓펀치에서는 기본적인 웹 서비스 외에 제휴를 통해 로켓펀치의 채용 공고를 위젯 형식으로 노출하는 경우가 있습니다. (예 : 플래텀 오른쪽 사이드바 위젯) 이런 위젯들을 운영하다 보니 몇 가지 추가적인 요구 사항이 생겼는데요. 주로 아래의 두 가지로 요약할 수 있습니다. 제휴를 맺은 곳의 갑작스러운 트래픽 증가가 로켓펀치 웹 서비스에 영향을 주지 않을 것 로켓펀치에서 일시적인 오 류가 … 더 보기 “300원에 200만뷰 소화하기 – 서버리스 아키텍처 AWS 람다(Lambda) 활용 사례”
![](assets/images/2023/02/Untitled-1024x450.png?resize=1024%2C450&ssl=1)
](https://blog.rocketpunch.com/2017/07/02/2-million-pv-with-300-krw/)
  • 기초 매뉴얼 같은 블로그
[
Zappa를 활용하여 Django 배포하기
Zappa를 활용하여 Django 프로젝트를 API Gateway + Lambda를 활용한 서버리스 아키텍쳐로 배포하는 과정에 대해 공유합니다.
![](https://i0.wp.com/kangraemin.github.io/django/2020/10/03/django-zappa-serverless/assets/images/avatar.gif?ssl=1)
](https://kangraemin.github.io/django/2020/10/03/django-zappa-serverless/)
  • 2022 최근 글
[
Zappa로 서버리스 배포
zappa를 이용한 lambda 배포 방법 (python + django + RDS(postgresql))
![](assets/images/2023/02/image.jpg?ssl=1)
](https://velog.io/@ben_jh/Zappa%EB%A1%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EB%B0%B0%ED%8F%AC)
  • API 게이트웨이 예제 프로젝트
[
Zappa를 이용한 Serverless 배송 조회 API 구현
캐시슬라이드에는 상품을 구매하면 리워드를 적립 받을 수 있는 쇼핑하고 적립받기라는 서비스가 있습니다. 쇼핑하고 적립받기는 계속해서 신규 기능을 붙여가면서 점점 이커머스답게 성장해가고 있습니다. 그 과정에 통합적으로 사용할 기능을 Serverless…
![](assets/images/2023/02/0Z-nL_E0X9nW0h887.jpg?ssl=1)
](https://medium.com/nbt-tech/zappa%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-serverless-%EB%B0%B0%EC%86%A1-%EC%A1%B0%ED%9A%8C-api-%EA%B5%AC%ED%98%84-411006291ce9)
  • 구조 그림이 예술
[
AWS Serverless 웹서비스 구축 경험 후기(1탄)
지난 1년 동안 아래와 같은 구조의 서버리스(serverless) 아키텍처의 웹서비스를 구축, 개발, 운영했습니다 일단 본 프로젝트는 아래와 같이 크게 3가지로 구성됩니다 frontend : UI, React 프로젝트 backend :..
![](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpB5gQ%2FbtrCHOWoqSA%2F1Lrbrf4JhX3xBlAtX8lSw0%2Fimg.png)
](https://gnidoc.tistory.com/entry/AWS-Serverless-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%EC%B6%95-%EA%B2%BD%ED%97%98-%ED%9B%84%EA%B8%B01%ED%83%84)

Django – settings.py 변수 상수 사용하기

전역변수나 상수처럼 settings.py 에 정의된 놈들을 쓰고 싶다면 이렇게 하자.

settings.py 에 다음과 같은 변수를 정의했다고 치자.

SLACKBOT_TOKEN = os.environ.get("SLACKBOT_TOKEN", "")SLACKBOT_CHANNEL = os.environ.get("SLACKBOT_CHANNEL", "")

app 이나 장고 코드 어디선가 이 상수 변수를 쓰고 싶다면 다음과 같이 사용하면 된다.

from django.conf import settingsSLACKBOT_TOKEN = getattr(settings, "SLACKBOT_TOKEN", "")print(SLACKBOT_TOKEN)
  • getattr() 안쓰고 그냥 settings.SLACKBOT_TOKEN 해도 되는 것 아닌가? => 되는 것 같다. 😁

참고 사이트

  • 예제는 아래 글에서 가져왔어요. 감사합니다. 👍
[
Django2, settings.py에 설정한 변수를 APP에서 사용하는 방법
settings.py에 설정한 변수를 APP에서 사용하는 방법 Django 프로그램을 작성하다보면 특정 변수를 모든 app 에서 사용하면 좋은 경우가 생긴다. 이런 경우에, settings.py에 변수를 설정하면 원하는 곳에서 불러서 사용할 수 있다. 먼저, settings.py 에 사용하고자 하는 변수(GATHER_INTERVAL)를 넣는다. set…
![](assets/images/2023/02/blank.jpg?ssl=1)
](https://blog.boxcorea.com/wp/archives/2692)