[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 22 회차 미션
2020. 11. 23. 21:49ㆍCoding/Python-Fastcampus
728x90
03. View - 09. 상품 주문하기 (2)
request.session 가져오기.
1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from django import forms
from .models import Order
from product.models import Product
from fcuser.models import Fcuser
class RegisterForm(forms.Form) :
def __init__(self, request, *args, **kwargs) :
super().__init__(*args, **kwargs)
self.request = request
quantity = forms.IntegerField(
error_messages = {
"required":"수량을 입력해주세요."
},
label='수량'
)
product = forms.IntegerField(
error_messages = {
"required":"상품을 입력해주세요."
},
label='상품',
widget=forms.HiddenInput
)
|
cs |
2.
product의 views.py
1
2
3
4
5
6
7
8
9
|
class ProductDetail(DetailView) :
template_name = 'product_detail.html'
queryset = Product.objects.all()
context_object_name = 'product'
def get_context_data(self, **kwargs) :
context = super().get_context_data(**kwargs)
context['form'] = OrderForm(self.request)
return context
|
cs |
3.
product_detail.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
{% extends 'base.html' %}
{% load humanize %}
{% block contents %}
<div class="row mt-5">
<div class="col-12">
<div class="card" style="width: 100%;">
<div class="card-body">
<h5 class="card-title">{{ product.name }}</h5>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<form method="POST" action="/order/create">
{% csrf_token %}
{% for field in form %}
<div class='form-group'>
{% ifnotequal field.name 'product' %}
<label for="{{field.id_for_label}}">{{ field.label }}</label>
{% endifnotequal %}
<input type="{{ field.field.widget.input_type }}" class="form-control" id="{{ field.id }}"
placeholder="{{ field.label }}" name="{{ field.name }}"
value="{% ifequal field.name 'product' %}{{product.id}}{% endifequal %}" />
</div>
{% if field.errors %}
<span style="color: red;">{{ field.errors }}</span>
{% endif%}
{% endfor %}
<button type="submit" class="btn btn-primary">주문하기</button>
</form>
</li>
<li class="list-group-item">가격 : {{ product.price|intcomma }} 원</li>
<li class="list-group-item">등록날짜 : {{ product.register_date|date:'Y-m-d H-i' }}</li>
<li class="list-group-item">설명 : {{ product.description|safe }}</li>
</ul>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<a href="/product/">목록보기</a>
</div>
</div>
{% endblock %}
|
cs |
14줄의 csrf_token 추가.
4.
order의 views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from django.shortcuts import render, redirect
from django.views.generic import FormView
from .forms import RegisterForm
# Create your views here.
class OrderCreate(FormView) :
form_class = RegisterForm
success_url = '/product'
def form_invalid(self, form) :
return redirect('/product' + str(form.product))
def get_form_kwargs(self, **kwargs) :
kw = super().get_form_kwargs(**kwargs)
kw.update({
'request':self.request
})
return kw
|
cs |
5.
session 받을 수 있는지 확인.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
from django import forms
from .models import Order
from product.models import Product
from fcuser.models import Fcuser
class RegisterForm(forms.Form) :
def __init__(self, request, *args, **kwargs) :
super().__init__(*args, **kwargs)
self.request = request
quantity = forms.IntegerField(
error_messages = {
"required":"수량을 입력해주세요."
},
label='수량'
)
product = forms.IntegerField(
error_messages = {
"required":"상품을 입력해주세요."
},
label='상품',
widget=forms.HiddenInput
)
def clean(self) :
cleaned_data = super().clean()
quantity = cleaned_data.get('quantity')
product = cleaned_data.get('product')
fcuser = self.request.session.get('user')
print(self.request.session)
|
cs |
session값이 출력되면 성공.
가져온 session으로 fcuser의 .models를 불러와서 Fcuser객체를 활용하면된다.
주문 완료.
50개 남아있던게 5개 주문해서 45개로 줄었다.
03. View - 10. 상품 주문하기 (3)
transaction : 여러가지 동작을 하나로 처리를 해서, 중간에 하나라도 잘못되면 실패, 모두 성공해야 성공으로 처리.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
from django import forms
from .models import Order
from product.models import Product
from fcuser.models import Fcuser
from django.db import transaction
class RegisterForm(forms.Form) :
def __init__(self, request, *args, **kwargs) :
super().__init__(*args, **kwargs)
self.request = request
quantity = forms.IntegerField(
error_messages = {
"required":"수량을 입력해주세요."
},
label='수량'
)
product = forms.IntegerField(
error_messages = {
"required":"상품을 입력해주세요."
},
label='상품',
widget=forms.HiddenInput
)
def clean(self) :
cleaned_data = super().clean()
quantity = cleaned_data.get('quantity')
product = cleaned_data.get('product')
fcuser = self.request.session.get('user')
if quantity and product and fcuser :
with transaction.atomic() :
prod = product=Product.objects.get(pk=product)
Order(
quantity=quantity,
product=prod,
fcuser=Fcuser.objects.get(email=fcuser)
).save()
prod.stock -= quantity
prod.save()
else :
self.product = product
self.add_error('quantity', '수량 값이 없습니다.')
self.add_error('product', '제품 값이 없습니다.')
self.add_error('fcuser', '사용자 값이 없습니다.')
|
cs |
db에서 제공하는 기능으로 import해서 사용하면된다.
with transaction.atomic() : 안에서 일어나는 일은 모두 하나의 transaction으로 처리된다.
그러므로 주문내역의 저장과 상품의 재고 감소가 전부 정상 처리되어야 진행된다.
07. 클래스 - 01. Self, 클래스 변수, 인스턴스 변수(1)
class활용의 기초.
1
2
3
4
5
6
7
8
9
10
|
class UserInfo:
def __init__(self, name) :
self.name = name
def user_info_p(self) :
print('name : ' + self.name)
user1 = UserInfo("lee")
user1.user_info_p()
|
cs |

__init__과 self라는걸 잘 써야한다.
print(user1.__dict__)
.__dict__으로 바로 사전형으로 출력가능하다.
올인원 패키지 : 파이썬 웹 개발👉https://bit.ly/33a7nvc
728x90
'Coding > Python-Fastcampus' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 24 회차 미션 (0) | 2020.11.25 |
---|---|
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 23 회차 미션 (0) | 2020.11.24 |
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 21 회차 미션 (0) | 2020.11.22 |
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 20 회차 미션 (0) | 2020.11.21 |
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 19 회차 미션 (0) | 2020.11.20 |