본문 바로가기
Back-end/Django

[Django] User확장과 인증(실습1)

by 안녕주 2021. 7. 20.

 

1. account이름의 app만들기

#manage.py가 있는 곳으로 이동
python manage.py startapp account

2. settings.py에 account 추가

3. 새로만들어진 account 폴더의 views.py 수정

from django.shortcuts import render
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm

def login_view(request):
    form = AuthenticationForm()
    return render(request, 'login.html',{'form' : form})

4. account폴더에 urls.py 생성

from django.urls import path
from .views import * 

urlpatterns = [
    path('login/', login_view, name="login"),
]

5. lionproject 폴더의 urls.py 코드 수정(account.urls연결)

from django.contrib import admin
from django.urls import path, include 
from blog.views import home
from django.conf import settings  #setting.py를 뜻하는게 아니다.
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name="name"),
    path('blog/', include('blog.urls')),
    path('account/', include('account.urls')),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

6. account/templates 에 login.html 생성하기

{% extends 'base.html' %}

{% block content %}

<h1>Login</h1>
<form action="{%url 'create' %}" method="post" > 
    {%csrf_token%}
    {{form}}
    <button type="submit">Submit</button>
</form>

{% endblock %}

7. base.html에 a태그로 login.html 연결해주기 : 36번째 줄 수정

<li class="nav-item">
    <a class="nav-link" href="{% url 'login' %}">Login</a>
</li>

8. runserver

 

9. login.html의 action 수정

{% extends 'base.html' %}

{% block content %}

<h1>Login</h1>
<form action="{%url 'login' %}" method="post" > 
    {%csrf_token%}
    {{form}}
    <button type="submit">Submit</button>
</form>

{% endblock %}

10. views.py 수정

from django.shortcuts import redirect, render
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib.auth import authenticate,login,logout

def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(request=request, data = request.POST)
        if form.is_valid(): #유효성 검사
            username = form.cleaned_data.get("username")  #클린한 데이터를 get해와서 저장
            password = form.cleaned_data.get("password")
            user = authenticate(request=request, username=username, password=password)
            if user is not None: #유저가 존재할때
                login(request, user)
            return redirect('home')

    else :
        form = AuthenticationForm()
        return render(request, 'login.html',{'form' : form})

def logout_view(request):
    logout(request)
    return redirect('home')

11. urls.py에 logout함수의 path추가

from django.urls import path
from .views import * 

urlpatterns = [
    path('login/', login_view, name="login"),
    path('logout/', logout_view, name="logout")
]

12. base.html에 logout 태그 추가

<li class="nav-item">
    <a class="nav-link" href="{% url 'logout' %}">Loout</a>
</li>

13. home.html 코드 수정통해 로그인이 제대로 되는지 확인하기

{% extends 'base.html' %}
{% block content %}

{% if usser.is_authenticated %}
{{user.name}}
{% endif %}

<h1>Blog Project</h1>
<div>
    <a href="{%url 'new' %}">Write</a>
</div>
<div class="container">
    {%for blog in blogs %}
    <div>
        <h3>{{blog.title}} </h3>
        {{blog.id}}
        {{blog.writer}}
        {{blog.summary}} <a href="{% url 'detail' blog.id %}"> ...more </a>
        <!--detail이라는 url에 요청을 보내는데, blog.id도 같이 보낸다.-->
        <br>
    </div>
    {% endfor %}
</div>

{% endblock %}

 

14. runserver(오류 발생...!)

 

NoReverseMatch

Reverse for 'home' not found. 'home' is not a valid view function or pattern name.

 

 

---> 해결 (lionproject 파일의 urls.py에 오타...!)

from django.contrib import admin
from django.urls import path, include 
from blog.views import home
from django.conf import settings  #setting.py를 뜻하는게 아니다.
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name="home"),  # name = "name" 이라고 되어 있었다...!
    path('blog/', include('blog.urls')),
    path('account/', include('account.urls')),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

 

 

 

'Back-end > Django' 카테고리의 다른 글

[Django] User 확장과 인증 (실습2)  (0) 2021.07.20
[Django] User 확장과 인증(이론)  (0) 2021.07.20
[Django] Form  (0) 2021.07.19
[Django] Media  (0) 2021.07.19
[Django] Static  (0) 2021.07.19

댓글