From 6c2057baeea67892e0865b589aa80e16f70f7e7c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9CROHYUNSEO=E2=80=9D?= <“hyunseo224@gmail.com”>
Date: Tue, 8 Aug 2023 16:45:39 +0900
Subject: [PATCH 1/2] main page update
---
Users/admin.py | 9 +++-
Users/models.py | 11 ++++-
Users/templates/login.html | 19 +++++++++
Users/templates/main.html | 19 +++++++++
Users/templates/signup_complete.html | 12 ++++++
Users/templates/signup_form.html | 29 +++++++++++++
Users/views.py | 61 +++++++++++++++++++++++++++-
config/settings.py | 2 +-
config/urls.py | 10 ++++-
9 files changed, 167 insertions(+), 5 deletions(-)
create mode 100644 Users/templates/login.html
create mode 100644 Users/templates/main.html
create mode 100644 Users/templates/signup_complete.html
create mode 100644 Users/templates/signup_form.html
diff --git a/Users/admin.py b/Users/admin.py
index 8c38f3f..0530d34 100644
--- a/Users/admin.py
+++ b/Users/admin.py
@@ -1,3 +1,10 @@
from django.contrib import admin
+from .models import Country
-# Register your models here.
+class CountryAdmin(admin.ModelAdmin):
+ pass
+
+admin.site.register(Country, CountryAdmin)
+
+# 'Countrys' 텍스트를 'Countries'로 수정
+admin.site.verbose_name_plural = 'Countries'
diff --git a/Users/models.py b/Users/models.py
index 71a8362..acb7b9c 100644
--- a/Users/models.py
+++ b/Users/models.py
@@ -1,3 +1,12 @@
from django.db import models
-# Create your models here.
+class Country(models.Model):
+ name = models.CharField(max_length=100)
+
+ def __str__(self):
+ return self.name
+
+class User(models.Model):
+ name = models.CharField(max_length=100)
+ password = models.CharField(max_length=100)
+ country = models.ForeignKey(Country, on_delete=models.CASCADE)
\ No newline at end of file
diff --git a/Users/templates/login.html b/Users/templates/login.html
new file mode 100644
index 0000000..c6e1923
--- /dev/null
+++ b/Users/templates/login.html
@@ -0,0 +1,19 @@
+
+
+
+ 로그인
+
+
+ 로그인
+
+
+
diff --git a/Users/templates/main.html b/Users/templates/main.html
new file mode 100644
index 0000000..d365e37
--- /dev/null
+++ b/Users/templates/main.html
@@ -0,0 +1,19 @@
+
+
+
+ 메인 페이지
+
+
+ 메인 페이지
+ {% if user.is_authenticated %}
+ 로그인된 사용자: {{ user.username }}
+
+ {% else %}
+ 로그인 안 됨
+ 로그인
+ {% endif %}
+
+
diff --git a/Users/templates/signup_complete.html b/Users/templates/signup_complete.html
new file mode 100644
index 0000000..ce98a3a
--- /dev/null
+++ b/Users/templates/signup_complete.html
@@ -0,0 +1,12 @@
+
+
+
+ 회원가입 완료
+
+
+ 회원가입이 완료되었습니다!
+ 이름: {{ name }}
+ 나라: {{ country }}
+ 메인페이지로 가기
+
+
diff --git a/Users/templates/signup_form.html b/Users/templates/signup_form.html
new file mode 100644
index 0000000..871c439
--- /dev/null
+++ b/Users/templates/signup_form.html
@@ -0,0 +1,29 @@
+
+
+
+ 회원가입
+
+
+ 회원가입
+
+
+
diff --git a/Users/views.py b/Users/views.py
index 91ea44a..07fbd5e 100644
--- a/Users/views.py
+++ b/Users/views.py
@@ -1,3 +1,62 @@
+from rest_framework.views import APIView
+from rest_framework.response import Response
+from rest_framework import status
+from django.contrib.auth.hashers import make_password
+from django.contrib.auth import authenticate, logout
+from django.conf import settings
+import jwt
from django.shortcuts import render
-# Create your views here.
+from .models import User
+from .models import Country
+from django.contrib.sessions.backends.db import SessionStore
+
+class CountriesListView(APIView):
+ def get(self, request):
+ countries = Country.objects.all()
+ return render(request, 'signup_form.html', {'countries': countries})
+ # countries = Country.objects.all().values_list('name', flat=True)
+ # return Response(countries)
+
+class SignupView(APIView):
+ def get(self, request):
+ countries = Country.objects.all()
+ context = {'countries': countries}
+ return render(request, 'signup_form.html', context)
+
+ def post(self, request):
+ name = request.data.get('name')
+ password = request.data.get('password')
+ country = request.data.get('country')
+
+ hashed_password = make_password(password)
+ user = User.objects.create(name=name, password=hashed_password, country=country)
+
+ payload = {'user_id': user.id, 'name': user.name, 'country': user.country} # type: ignore
+ token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256')
+
+ # 회원가입이 완료되었다는 문구와 메인페이지로 가기 버튼을 포함한 페이지 렌더링
+ context = {'name': name}
+ return render(request, 'signup_complete.html', context)
+
+class LoginView(APIView):
+ def get(self, request):
+ return render(request, 'login.html')
+
+ def post(self, request):
+ name = request.data.get('name')
+ password = request.data.get('password')
+
+ user = authenticate(request, username=name, password=password)
+ if user:
+ payload = {'user_id': user.id, 'name': user.name, 'country': user.country} # type: ignore
+ token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256')
+ return Response({'token': token})
+ else:
+ return Response({'message': 'Login failed.'}, status=status.HTTP_401_UNAUTHORIZED)
+
+class LogoutView(APIView):
+ def post(self, request):
+ # 로그아웃은 클라이언트 측에서 JWT를 삭제하면 됩니다.
+ logout(request)
+ return Response({'message': 'Logged out.'})
diff --git a/config/settings.py b/config/settings.py
index d014560..a5100fa 100644
--- a/config/settings.py
+++ b/config/settings.py
@@ -78,7 +78,7 @@
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [],
+ 'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
diff --git a/config/urls.py b/config/urls.py
index ee45a6b..eb0df30 100644
--- a/config/urls.py
+++ b/config/urls.py
@@ -18,8 +18,16 @@
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
+from Users import views
+from Users.views import SignupView, LoginView, LogoutView, CountriesListView
+
urlpatterns = [
path('admin/', admin.site.urls),
+ path('signup/', SignupView.as_view(), name='signup'),
+ path('api/signup/', SignupView.as_view(), name='api-signup'),
+ path('login/', LoginView.as_view(), name='login'),
+ path('logout/', LogoutView.as_view(), name='logout'),
+ path('countries/', CountriesListView.as_view(), name='countries-list'),
]
-+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
+#+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
From 1023d14e8cfb0866e2e56ffd706aebd6b206c365 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9CROHYUNSEO=E2=80=9D?= <“hyunseo224@gmail.com”>
Date: Thu, 10 Aug 2023 16:42:53 +0900
Subject: [PATCH 2/2] Users models update
---
Users/models.py | 27 ++++++++++++++++++++++++++-
Users/views.py | 3 +--
2 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/Users/models.py b/Users/models.py
index acb7b9c..cd214a6 100644
--- a/Users/models.py
+++ b/Users/models.py
@@ -1,12 +1,37 @@
from django.db import models
+from django.contrib.auth.models import BaseUserManager
class Country(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
+from django.contrib.auth.models import BaseUserManager
+
+class UserManager(BaseUserManager):
+ def create_user(self, email, password=None, **extra_fields):
+ if not email:
+ raise ValueError('The Email field must be set')
+ email = self.normalize_email(email)
+ user = self.model(email=email, **extra_fields)
+ user.set_password(password)
+ user.save(using=self._db)
+ return user
+
+ def create_superuser(self, email, password=None, **extra_fields):
+ extra_fields.setdefault('is_staff', True)
+ extra_fields.setdefault('is_superuser', True)
+
+ if extra_fields.get('is_staff') is not True:
+ raise ValueError('Superuser must have is_staff=True.')
+ if extra_fields.get('is_superuser') is not True:
+ raise ValueError('Superuser must have is_superuser=True.')
+
+ return self.create_user(email, password, **extra_fields)
class User(models.Model):
name = models.CharField(max_length=100)
+ email = models.EmailField(unique=True)
password = models.CharField(max_length=100)
- country = models.ForeignKey(Country, on_delete=models.CASCADE)
\ No newline at end of file
+ country = models.ForeignKey(Country, on_delete=models.CASCADE)
+ objects=UserManager()
\ No newline at end of file
diff --git a/Users/views.py b/Users/views.py
index 07fbd5e..da98c45 100644
--- a/Users/views.py
+++ b/Users/views.py
@@ -35,7 +35,7 @@ def post(self, request):
payload = {'user_id': user.id, 'name': user.name, 'country': user.country} # type: ignore
token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256')
- # 회원가입이 완료되었다는 문구와 메인페이지로 가기 버튼을 포함한 페이지 렌더링
+ # 회원가입이 완료되었다는 문구, 메인페이지로 가기 버튼 있는 페이지로
context = {'name': name}
return render(request, 'signup_complete.html', context)
@@ -57,6 +57,5 @@ def post(self, request):
class LogoutView(APIView):
def post(self, request):
- # 로그아웃은 클라이언트 측에서 JWT를 삭제하면 됩니다.
logout(request)
return Response({'message': 'Logged out.'})