페이지 디자인은 장고기초강의 의 html 파일을 그대로 가져왔다
그냥 강의를 들을때는 그저 쉽게 진행했던 부분인데 직접 진행하려하니 생각보다 로그인 , 회원가입기능부터 버벅거렸다
일단 , 폼을 사용해서 만들으라는 과제내용에 따라 폼으로 유저정보를 받아오는 방법을 배우는데 시간이 오래 걸렸다
class UserForm(UserCreationForm):
email = forms.EmailField(label="이메일")
class Meta:
model = User
fields = ("username", "password1", "password2", "email")
위 클래스는 기본적으로 강의안에 있던 내용인데 이메일을 추가했다
회원가입페이지에는 개인과제의 요구사항인 유저 네임 , 비밀번호 , 비밀번호 확인 , 이메일을 입력받아 저장하게했다
def log_in(request): # 함수 이름을 변경
if request.method == "POST":
form = LoginForm(request.POST)
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect('../')
else:
return HttpResponse('로그인 실패. 다시 시도 해보세요.')
else:
form = LoginForm()
return render(request, 'users/log_in.html', {'form': form})
회원가입후 로그인하면 나오는 기본 페이지이다
#홈으로 사용할기능 홈으로 가기위한 함수
def home(request):
if request.user.is_authenticated:
return redirect('product-list')
else:
return redirect('/log_in')
로그인이 되어있으면 장고의 템플릿태그를 사용해서 "<<사용자의이름>> 님 안녕하세요" 와 "로그아웃을 출력하게했다"
회원가입이 안되있는상태면 리스트 페이지에는 접근이 안되고 상단에는 로그인, 로그아웃을 출력한다
일단 나는 기본페이지를 이 리스트 페이지로 정하고 기준은 로그인이 되어있는가 아닌가로 판단해서 로그인이 되어있다면 product_list 페이지로 이동하게 했고 로그인이 되있지 않으면 로그인페이지로 이동하게 했다 장고 기본 기능인 로그인기능을 이용해서 @login_required 를 사용하면 로그인이 되어있어야만 해당 함수가 실행된다
#재고 리스트 함수
@login_required
def product_list_view(request):
products = Product.objects.all()
context = {
'products': products
}
return render(request, 'product/product-list.html', context)
제품을 등록하기 위한 페이지다 여기서 등록한 제품을 입고 , 풀고를 관리할 수 있게 만들어두었다
제품의 이름,제품코드,제품설명,사이즈,가격을 입력받아 데이터베이스에 저장할수있게 만들었다
class Product(models.Model):
code = models.IntegerField()
name = models.CharField(max_length=256)
description = models.CharField(max_length=256)
price = models.IntegerField()
stock_quantity = models.IntegerField(default=0)
sizes = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
('F', 'Free'),
)
size = models.CharField(choices=sizes, max_length=1)
def __str__(self):
return str(self.code)
#제품을 저장하는 메소드
def save(self, *args, **kwargs):
if not self.pk: # 새로운 상품이 생성될 때
self.stock_quantity = 0 # stock_quantity를 0으로 초기화
super().save(*args, **kwargs)
제품 입고를 위한 페이지인데 버튼 하나로 입고 , 출고를 나눌껄 이라는 생각은 다 만든 뒤에 생각해내서 다음에 해봐야겠다고 생각한다
제품 코드의 코드로 제품을 선택하고 Product 클래스의 stock_quan 으로 quantity 갯수를 저장한다
@login_required
def inbound(request):
if request.method == 'POST':
form = InboundForm(request.POST)
if form.is_valid():
inbound = form.save(commit=False)
inbound.product.stock_quantity += form.cleaned_data['quantity']
inbound.product.save()
inbound.save()
return redirect('product-list')
else:
form = InboundForm()
context = {
'form': form
}
return render(request, 'product/inbound.html', context)
위의 제품입고와 거의 비슷하다 더하기 빼기이다 ..
#제품을 출고하는 함수
@login_required
def outbound(request):
if request.method == 'POST':
form = InboundForm(request.POST)
if form.is_valid():
product = form.cleaned_data['product']
quantity = form.cleaned_data['quantity']
stock_quantity = product.stock_quantity - quantity
if stock_quantity < 0:
stock_quantity = 0
product.stock_quantity = stock_quantity
product.save()
Outbound.objects.create(product=product, quantity=quantity)
return redirect('product-list')
else:
form = InboundForm()
context = {
'form': form
}
return render(request, 'product/outbound.html', context)
오늘은 이렇게 까지 만들었는데 만드는 과정에서 정말 무수한 에러들을 겪었다 urls.py 에 오타가 있어서 페이지가 정상적으로 이동이 안된다던지, html 파일에 password 를 views.py 에 있는 password1과 다르게썻다던지 이런 어이없는 경우도 많이있었지만
내가 모르는 기능을 기본적으로 사용을 했기때문에 구글링을 해가면서 어떤점이 잘못됬는지 찾는 과정이 정말많았다 사실 로그인 기능 , 회원가입기능에서 제일 많았던거같다 아마 폼을 처음 사용해봐서 그런거같다
마이그레이션 하는과정에서도 오류가생겨서 데이터베이스 파일을 지우고 새로 마이그레이션도 했고 입고 , 출고를하면 두번씩 저장이되서 10개를 저장하면 20개가 되는 오류도 있었다 이건 save 를 두번써서 그랬다
이렇게 많은 오류를겪고 해결해 나가는 과정이 많이 부족하고 검색하고 해겨했다고 해서 다음에 다시 그 문제를 만났을때 아 ! 이거 하고 해결해낼 자신이 솔찍히 아직은 없다 대신 다음에 이런 오류들을 만났을때 지금처럼 당황해하지는 않을것 같다 .