[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 22 회차 미션

2020. 11. 23. 21:49Coding/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