31번째 줄: |
31번째 줄: |
| ==탬플릿 만들기== | | ==탬플릿 만들기== |
| ===login.html=== | | ===login.html=== |
− | <syntaxhighlight lang="html+django"> | + | 기본적으로 id와 password를 입력하게 되어 있는데, 분명 모델에선 identifier를 식별필드로 지정했는데, 이 코드를 USERNAME_FIELD에 지정하기 때문인지, form 안엔 username으로 받아들이게끔 구성되어 있다. 즉, 식별필드가 무엇이든 username이라는 이름을 사용해서 로그인이 이루어지게 된다.<syntaxhighlight lang="html+django"> |
− | {% extends "연결할.html" %} | + | {% extends "base.html" %} |
| | | |
| {% block content %} | | {% block content %} |
− | <div class="container">
| + | <form method="post" action="{% url 'account:login' %}"> |
− | <form method="post" action="{% url 'membership:login' %}">
| + | {% csrf_token %} |
− | {% csrf_token %}
| |
| <!-------------------------------------- 입력에 에러가 났을 때 불러올 html--> | | <!-------------------------------------- 입력에 에러가 났을 때 불러올 html--> |
− | {% include "form_errors.html" %}
| + | {% include "form_errors.html" %} |
| <!-------------------------------------- 입력을 위한 공간--> | | <!-------------------------------------- 입력을 위한 공간--> |
− | <div class="form-group">
| + | <div class="form-group"> |
− | <label for="username">ID</label>
| + | <label for="username">ID</label> |
− | <input type="text" class="form-control" name="username" id="username"
| + | <input type="text" class="form-control" name="username" id="username" |
− | value="{{ form.username.value|default_if_none:'' }}">
| + | value="{{ form.username.value|default_if_none:'' }}"> |
− | </div>
| + | </div> |
− | <div class="form-group">
| + | <div class="form-group"> |
− | <label for="password">비밀번호</label>
| + | <label for="password">비밀번호</label> |
− | <input type="password" class="form-control" name="password" id="password"
| + | <input type="password" class="form-control" name="password" id="password" |
− | value="{{ form.password.value|default_if_none:'' }}">
| + | value="{{ form.password.value|default_if_none:'' }}"> |
− | </div>
| + | </div> |
− | <button type="submit" class="btn btn-primary">로그인</button>
| + | <button type="submit" class="btn btn-primary">로그인</button> |
− | </form> | + | |
− | </div> | + | <input type="hidden" name="next" value="{{ next }}"><!--로그인 성공 후 이전 페이지로 이동하게끔 하는 기능--> |
| + | </form> |
| {% endblock %} | | {% endblock %} |
| </syntaxhighlight> | | </syntaxhighlight> |
| ===form_errors.html=== | | ===form_errors.html=== |
− | membership 앱과 관련한 모든 에러메시지를 관리하기 위해 에러메시지만 띄우는 탬플릿을 만든다. 일괄적, 일관적으로 모든 공간에 적용할 수 있게끔.
| + | account 앱과 관련한 모든 에러메시지를 관리하기 위해 에러메시지만 띄우는 탬플릿을 만든다. 일괄적, 일관적으로 모든 공간에 적용할 수 있게끔. |
| | | |
| 에러가 발생했을 때 에러메시지를 띄울 html을 불러온다.<syntaxhighlight lang="html+django"> | | 에러가 발생했을 때 에러메시지를 띄울 html을 불러온다.<syntaxhighlight lang="html+django"> |
82번째 줄: |
82번째 줄: |
| ==로그인, 로그아웃 성공 후 이동할 url 만들기== | | ==로그인, 로그아웃 성공 후 이동할 url 만들기== |
| ===로그인 url=== | | ===로그인 url=== |
− | 일반적으로 <code>@login_required(login_url='membership:login')</code> 형태로 로그인 url을 써주어야 하지만, 모든 함수에 이걸 써넣긴 어렵고, 수정에도 불편하다. | + | 일반적으로 <code>@login_required(login_url='account:login')</code> 형태로 로그인 url을 써주어야 하지만, 모든 함수에 이걸 써넣긴 어렵고, 수정에도 불편하다. |
| | | |
− | => settings.py에 <code>LOGIN_URL = 'membership:login'</code> 형태로 변수를 지정하면 데코레이터의 괄호에 무언가를 써주지 않아도 잘 기능한다. | + | => settings.py에 <code>LOGIN_URL = 'account:login'</code> 형태로 변수를 지정하면 데코레이터의 괄호에 무언가를 써주지 않아도 잘 기능한다. |
| ===로그인 로그아웃 후 리다이렉트=== | | ===로그인 로그아웃 후 리다이렉트=== |
| settings.py에서 새로운 설정항목을 만들어주어야 한다. | | settings.py에서 새로운 설정항목을 만들어주어야 한다. |
109번째 줄: |
109번째 줄: |
| |} | | |} |
| ===보던 페이지로 돌아가기=== | | ===보던 페이지로 돌아가기=== |
− | 그런데, 사실 로그인 후에 보던 페이지가 안나오면 다시 찾아들어가야 하고.. 불편하다; 다행스럽게도 로그인 기능을 제대로 구현해두면 로그인 페이지로 넘어갈 때 링크가 [http://127.0.0.1:8000/membership/login/?next=/pool/question/create/ http://127.0.0.1:8000/membership/login/?next=/보고있던페이지/] 형태로 구성된다. 이전 페이지에 대한 정보를 담고 있는데, 로그인 탬플릿에 다음의 숨겨진 항목을 추가하면 된다.(폼 안에 추가해야 한다.)<syntaxhighlight lang="html+django"> | + | 그런데, 사실 로그인 후에 보던 페이지가 안나오면 다시 찾아들어가야 하고.. 불편하다; 다행스럽게도 로그인 기능을 제대로 구현해두면 로그인 페이지로 넘어갈 때 링크가 [http://127.0.0.1:8000/membership/login/?next=/pool/question/create/ http://127.0.0.1:8000/account/login/?next=/보고있던페이지/] 형태로 구성된다. 이전 페이지에 대한 정보를 담고 있는데, 로그인 탬플릿에 다음의 숨겨진 항목을 추가하면 된다.(폼 안에 추가해야 한다.)<syntaxhighlight lang="html+django"> |
| <input type="hidden" name="next" value="{{ next }}"> | | <input type="hidden" name="next" value="{{ next }}"> |
| </syntaxhighlight>submit은 해당 링크에 대한 정보를 그대로 form으로 보내기에 <nowiki>{{next}}</nowiki>에 있는 이전페이지 주소를 받아 기능한다. 로그인 함수에서 알아서 기능해준다. | | </syntaxhighlight>submit은 해당 링크에 대한 정보를 그대로 form으로 보내기에 <nowiki>{{next}}</nowiki>에 있는 이전페이지 주소를 받아 기능한다. 로그인 함수에서 알아서 기능해준다. |