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..cd214a6 100644 --- a/Users/models.py +++ b/Users/models.py @@ -1,3 +1,37 @@ from django.db import models +from django.contrib.auth.models import BaseUserManager -# Create your models here. +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) + objects=UserManager() \ 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 @@ + + + + 로그인 + + +

로그인

+
+ {% csrf_token %} + +

+ + +

+ + +
+ + 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 }}

+
+ {% csrf_token %} + +
+ {% 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 @@ + + + + 회원가입 + + +

회원가입

+
+ {% csrf_token %} + +

+ + +

+ + +

+ + +
+ + diff --git a/Users/views.py b/Users/views.py index 91ea44a..da98c45 100644 --- a/Users/views.py +++ b/Users/views.py @@ -1,3 +1,61 @@ +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): + 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)