[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()