본문 바로가기

프로젝트형 IoT 서비스 개발 4회차/1. 인터페이스 개발

[Day23] 2022-02-28(월) Web Application 4 - Django 활용 - 이진만 강사님

728x90

[1] Django 케이스 정리

  1. 업로드 파일 저장할 곳 설정

    - config/settings.py

UPLOAD_DIR = os.path.join(BASE_DIR, 'static/img')

 

  2. Django ORM으로 테이블(model) 생성 시 외래키 설정 방법

    - [app폴더]/models.py

    - models.ForeignKey(Cust, on_delete=models.CASCADE, related_name='custid')

      - Cust : 참조 model (class명)

      - on_delete=models.CASCADE : 참조된 object가 삭제되면, 참조하는 object도 삭제. 즉, 고객 정보(PK인 id 포함)가 삭제되면 고객(custid)의 장바구니 데이터도 삭제됨.

     - related_name='custid' : Cust 의 PK(id)와 custid를 연결

class Cart(models.Model):
    custid = models.ForeignKey(Cust, on_delete=models.CASCADE, related_name='custid')
    itemid = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='itemid')
    num = models.IntegerField(blank=True, null=True)
    regdate = models.DateField(auto_now=True)

 

  3. <form> 태그 method 옵션이 "post"인 경우

    - {% csrf_token %} 추가 입력

<form action="/item/i" method="post" enctype="multipart/form-data">
    {% csrf_token %}    # django에서 post방식일 경우 필요
    NAME<input type="text" name="name"><br>
    PRICE<input type="number" name="price"><br>
    IMG<input type="file" name="img"><br>

    <input type="submit" value="ADD">
</form>

 

  4. <form> 태그에서 file을 받을 경우

    - method="post"

    - enctype="multipart/form-data"

    - 당연히 {% csrf_token %} 도 추가

<form action="/item/i" method="post" enctype="multipart/form-data">
    {% csrf_token %}    # django에서 post방식일 경우 필요
    NAME<input type="text" name="name"><br>
    PRICE<input type="number" name="price"><br>
    IMG<input type="file" name="img"><br>

    <input type="submit" value="ADD">
</form>

 

  5. <form>을 통해 받은 데이터(name="xxxx"으로 연결)를 views에서 불러들이는 법

    ① method="get"

      - 텍스트나 숫자 : request.GET['xxxx']

    ② method="post"

      - 텍스트나 숫자 : request.POST['xxxx']

      - 파일 : request.FILES['xxxx']

      - 파일에서 이름만 추출 : [file]._name

name = request.POST['name']
price = request.POST['price']
imgname = ''
if 'img' in request.FILES:
    img = request.FILES['img']
    imgname = img._name

 

  6. session 객체 사용 방식

    - html 파일 : {{request.session.sessionid}}

    - python 파일 : request.session['sessionid']

 

  7. Django ORM으로 mySQL 연동

    - SELECT * FROM [table]  :  Cust.objects.all( )

    - SELECT * FROM [table] WHERE [condition]  :  Cust.objects.get(id=custpk)

    - INSERT INTO [table] VALUES(값1, 값2.... )  :  Item(name=name, price=price, imgname=imgname).save()

    - UPDATE [table] SET 열1=값1, 열2=값2... WHERE [조건]  :  다음과 같이 여러 줄 필요

obj = Guest.objects.get(id=id);
obj.title = title;
obj.content = content;
obj.save();

    - DELETE FROM [table] WHERE [조건] : Guest.objects.get(id=pk).delete()

obj = Guest.objects.get(id=pk);
obj.delete();

    - INNER JOIN 으로 객체 불러오기 : ( ) 안에 외래키 필드명 넣으면 해당 외래키와 연결된 테이블과 INNER JOIN

objs = Cart.objects.select_related('custid', 'itemid')

    - INNER JOIN 에 조건 추가하기 : .filter(조건)

objs_temp = Cart.objects.select_related('custid', 'itemid')
objs = objs_temp.filter(custid=request.session['sessionid'])

    - INNER JOIN 된 객체 html 문서에서 활용하기

      -> LEFT TABLE의 필드 값은 o.num 과 같이 바로 불러올 수 있음

      -> RIGHT TABLE(join된 table)들의 필드 값은 o.itemid.name 과 같이 LEFT TABLE의 외래키 필드명을 쓰고 RIGHT TABLE의 필드명을 써줘야함

{% for o in objs %}
<h3><img src="/static/img/{{o.itemid.imgname}}">
    {{o.itemid.name}} {{o.itemid.price}} {{o.num}} {{o.custid.name}}</h3>
{% endfor %}

 

[2] 그 외

  1. python에서 하드디스크에 파일 쓰기(write)

    - f = open('파일 경로', '방식')

    - f.write(), f.close()

    - chunks() : 큰 파일을 업로드 시 쪼개서 업로드하여 메모리 과부하를 막아줌( 아직 정확한 개념은 모르겠음 )

    (- 파일 용량이 크면 여러번 보내야 하니까 f.close()가 for문 밖에 있어야 하지 않을까???)

 f = open('%s/%s' % (UPLOAD_DIR, imgname), 'wb')
    for chunk in img.chunks()
        f.write(chunk)
        f.close()
728x90