100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

Day 86 - django로 CRUD+login 프로그램 만들기 (2)

ksyke 2024. 11. 29. 15:58

목차

    root/

    settings.py

    ALLOWED_HOSTS = ["*"]
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'home',
        'dept',
        'emp',
        'accounts',
    ]
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [BASE_DIR / 'templates'],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }

    urls.py

    from django.contrib import admin
    from django.urls import path, include
    import dept.views
    import emp.views
    import home.views
    
    urlpatterns = [
        path('',home.views.index),
        path('intro',home.views.intro),
        path('dept/',dept.views.list, name='deptList'),
        path('dept/add',dept.views.add),
        path('dept/<int:deptno>',dept.views.detail, name='deptDetail'),
        path('emp/',emp.views.list),
        path('admin/', admin.site.urls),
        path("accounts/", include("accounts.urls")),
    ]

    dept/

    admin.py

    from django.contrib import admin
    from dept.models import Dept
    # Register your models here.
    admin.site.register(Dept)

    views.py

    from django.http import HttpResponse, JsonResponse
    from django.shortcuts import render, redirect
    
    from dept.models import Dept
    import json
    
    
    # Create your views here.
    def list(req):
        # return HttpResponse('dept test page')
        result=Dept.objects.all()
        context={'result':result}
        return render(req,'dept/index.html',context)
    
    def add(req):
        # print(req.method)
        # for msg in dir(req):
        #     if not msg.startswith('_'): print(msg)
        if req.method=='GET':
            return render(req,'dept/add.html')
        elif req.method=='POST':
            dname,loc=req.POST['dname'],req.POST['loc']
            dept=Dept(dname=dname,loc=loc)
            dept.save()
            return redirect('deptList')
        else:
            return HttpResponse('test ok')
    
    def detail(req,deptno):
        print(req.method)
        # print(1,Dept.objects.all()[0])
        # print(2,Dept.objects.filter(deptno=deptno)[0])
        # print(3,Dept.objects.get(deptno=deptno))
        # print(4,Dept.objects.filter(dname__contains='test'))
        # print(5,Dept.objects.filter(deptno__gt=1))
        # print(6,Dept.objects.filter(deptno__lt=3))
        # dept=Dept.objects.filter(deptno=deptno)[0] if len(Dept.objects.filter(deptno=deptno))>0 else None
        # context={'dept':dept}
        # return render(req, 'dept/detail.html', context)
        if req.method=='GET':
            try:
                dept = Dept.objects.get(deptno=deptno)
                context = {'dept': dept}
                return  render(req,'dept/detail.html',context)
            except:
                return render(req, 'dept/detail.html', {'dept':None})
        elif req.method=='PUT':
            try:
                paramJson=json.loads(req.body)
                dept=Dept.objects.get(deptno=deptno)
                dept.dname=paramJson['dname']
                dept.loc=paramJson['loc']
                dept.save()
                return JsonResponse(data={"result":"success"})
            except Exception as e:
                # return JsonResponse(data={"result":"error","err":e})
                raise e
        elif req.method=='DELETE':
            Dept.objects.get(deptno=deptno).delete()
            return JsonResponse(data={"result":"success"})

    models.py

    from django.db import models
    
    # Create your models here.
    class Dept(models.Model):
        deptno=models.IntegerField(auto_created=True,primary_key=True,serialize=True)
        dname=models.CharField(max_length=10)
        loc=models.TextField()
        def __str__(self):
            return '{:0>4s}.'.format(str(self.deptno))+self.dname

    accounts/

    views.py

    from django.shortcuts import render, redirect
    # from django.contrib.auth.models import User'
    from accounts.models import  User
    # from django.contrib.auth import login, logout, authenticate
    # from django.contrib.auth.decorators import login_required
    from django.http import HttpResponse
    
    
    def user_signup(request):
        if request.method == "POST":
            username = request.POST["username"]
            password = request.POST["password"]
            email = request.POST.get("email", "")
            if not (username and password):
                return HttpResponse("이름과 패스워드는 필수입니다.")
            if User.objects.filter(username=username).exists():
                return HttpResponse("유저이름이 이미 있습니다.")
            if email and User.objects.filter(email=email).exists():
                return HttpResponse("이메일이 이미 있습니다.")
            # user = User.objects.create_user(username, email, password)
            # user.save()
            # user = authenticate(username=username, password=password)
            user=User(username=username,email=email,password=password)
            user.save()
            # login(request, user)
            return redirect("user_login")
        else:
            return render(request, "accounts/signup.html")
    
    
    def user_login(request):
        if request.method == "POST":
            username = request.POST["username"]
            password = request.POST["password"]
            # user = authenticate(request, username=username, password=password)
            user=User.objects.filter(username=username,password=password)
            if user is not None:
                # login(request, user)
                request.session['username']=username
                # request.session['email']=user.email
                return redirect("user_profile")
            else:
                return render(
                    request,
                    "accounts/login.html",
                    {"error": "아이디나 패스워드가 맞지 않습니다."},
                )
        else:
            return render(request, "accounts/login.html")
    
    
    def user_logout(request):
        # logout(request)
        print(request.session)
        request.session.clear()
        return redirect("user_login")
    
    
    # @login_required
    def user_profile(request):
        sessionUser=request.session.get('username')
        if sessionUser != None:
            return render(request, "accounts/profile.html", {"user": sessionUser})
        else:
            return redirect('user_login')

    models.py

    from django.db import models
    
    # Create your models here.
    class User(models.Model):
        username=models.CharField(max_length=5)
        email=models.CharField(max_length=20,db_index=True)
        password=models.IntegerField(max_length=16)

    urls.py

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path("signup/", views.user_signup, name="user_signup"),
        path("login/", views.user_login, name="user_login"),
        path("logout/", views.user_logout, name="user_logout"),
        path("profile/", views.user_profile, name="user_profile"),
    ]

    templates

    base/template.html

    <!DOCTYPE html>
    {% load static %}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" type="text/css" href="{% static '/css/bootstrap.min.css' %}">
    </head>
    <body>
        <nav class="navbar navbar-default">
          <div class="container-fluid">
            <div class="navbar-header">
              <a class="navbar-brand" href="/">
                인제대학교
              </a>
            </div>
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li><a href="/">home</a></li>
                    <li><a href="/intro">intro</a></li>
                    <li><a href="/dept/">dept</a></li>
                    <li><a href="/emp/">emp</a></li>
                    <li><a href="/accounts/login/">login</a></li>
                    <li><a href="/accounts/signup/">signup</a></li>
                </ul>
            </div>
          </div>
        </nav>
        <div class="container">
            {% block content %}
            {% endblock %}
            <footer>
              <address>
                김해캠퍼스 (50834) 경남 김해시 인제로 197TEL. 055-334-7111<br/>
                Copyright(c) 1996-2022 INJE University. All rights reserved.
              </address>
            </footer>
        </div>
    </body>
    </html>

    dept

    add

    {% extends 'base/template.html'  %}
        {% block content %}
        <h2>Add page(DEPT)</h2>
        <form method="post">
            {% csrf_token %}
            <div class="form-group">
                <input name="dname" placeholder="dname" class="form-control" value=""/>
            </div>
            <div class="form-group">
                <input name="loc" placeholder="loc" class="form-control" value=""/>
            </div>
            <div class="form-group">
                <button class="btn btn-primary btn-block">입력</button>
                <button type="reset" class="btn btn-default btn-block">취소</button>
                <button type="button" class="btn btn-default btn-block" onclick="history.back();">뒤로</button>
            </div>
        </form>
        {% endblock %}

    detail

    {% extends 'base/template.html'  %}
        {% block content %}
        <h2>Detail page(DEPT)</h2>
        <form method="post">
            {% csrf_token %}
            <div class="form-group">
                <input name="deptno" placeholder="deptno" class="form-control" value="{{dept.deptno}}" readonly/>
            </div>
            <div class="form-group">
                <input name="dname" placeholder="dname" class="form-control" value="{{dept.dname}}"/>
            </div>
            <div class="form-group">
                <input name="loc" placeholder="loc" class="form-control" value="{{dept.loc}}"/>
            </div>
            <div class="form-group">
                <button class="btn btn-primary btn-block">수정</button>
                <button type="button" class="btn btn-danger btn-block">삭제</button>
                <button type="button" class="btn btn-default btn-block" onclick="history.back();">뒤로</button>
            </div>
        </form>
    <script>
        const form=document.querySelector('form');
        form.querySelectorAll('button')[1].onclick=e=>{
            fetch('/dept/{{dept.deptno}}',{
                method:'DELETE'
            }).then(e=>e.ok).finally(()=>location.href='/dept/')
        };
        form.onsubmit=e=>{
            const dname=form.querySelectorAll('input')[2].value;
            const loc=form.querySelectorAll('input')[3].value;
            e.preventDefault();
            fetch('/dept/{{dept.deptno}}',{
                method:'PUT',
                body:'{"dname":"'+dname+'","loc":"'+loc+'"}'
            })
            .then(e=>e.json())
            .then(e=>location.href='/dept/')
            .catch(err=>{
                alert(err);
                location.href='/dept/';
            })
        }
    </script>
        {% endblock %}

    index

    {% extends 'base/template.html'  %}
        {% block content %}
        <h2>List page(DEPT)</h2>
        <table class="table">
            <thead>
                <tr>
                    <th>deptno</th>
                    <th>dname</th>
                    <th>loc</th>
                </tr>
            </thead>
            <tbody>
            {% for row in result %}
                <tr>
                    <td><a href="{{row.deptno}}">{{row.deptno}}</a></td>
                    <td><a href="{% url 'deptDetail' row.deptno %}">{{row.dname}}</a></td>
                    <td><a href="{% url 'deptDetail' row.deptno %}">{{row.loc}}</a></td>
                </tr>
            {% endfor %}
            </tbody>
        </table>
        <a href="add" class="btn btn-primary btn-block" role="button">입력</a>
        {% endblock %}

    accounts

    login

    {% extends 'base/template.html'%}
        {% block content %}
        <h2>login page</h2>
        <form method="post">
            {% csrf_token %}
            <label for="username_id">아이디</label>
            <input id="username_id" type="text" name="username">
    
            <label for="password_id">비밀번호</label>
            <input id="password_id" type="password" name="password">
    
            <button type="submit">로그인</button>
        </form>
    {% endblock %}

    profile

    {% extends 'base/template.html'%}
        {% block content %}
        <h1>개인 프로필 페이지</h1>
        <p>{{ user }}</p>
        <p>{{ user.username }}</p>
        <p>{{ user.email }}</p>
        <p>{{ user.first_name }}</p>
        <p>{{ user.last_name }}</p>
        <p>{{ user.is_staff }}</p>
        <p>{{ user.is_active }}</p>
        <p>{{ user.is_superuser }}</p>
        <p>{{ user.last_login }}</p>
        <p>{{ user.date_joined }}</p>
    
        <form action="{% url 'user_logout' %}" method="post">
          {% csrf_token %}
          <input type="submit" value="로그아웃">
        </form>
    {% endblock %}

    signup

    {% extends 'base/template.html'%}
        {% block content %}
        <h2>signup page</h2>
        <form action="" method="post">
            {% csrf_token %}
            <label for="username_id">아이디</label>
            <input id="username_id" type="text" name="username">
    
            <label for="email_id">이메일</label>
            <input id="email_id" type="text" name="email">
    
    
            <label for="password_id">비밀번호</label>
            <input id="password_id" type="password" name="password">
    
            <button type="submit">회원가입</button>
        </form>
    {% endblock %}