์ ์ ๊ฐ ์์ฑํ ๊ธ ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ ๋ง์ดํ์ด์ง๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
$ python manage.py startapp users
๊ทธ๋ฅ main ์ฑ์์ ํด๋ ๊ด์ฐฎ์ง๋ง, User์ ๋ํ ์๋น์ค๊ฐ ์ปค์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ๋๋์ด ๊ด๋ฆฌ๋ฅผ ํด ์ฃผ๋ ๊ฒ์ด ์ข๊ธฐ ๋๋ฌธ์ ์ฑ์ ๋ง๋ค๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ก์ด ์ฑ์ ์์ฑํ์์ผ๋ basic/settings.py ์ INSTALLED_APPS์ ์ถ๊ฐํด์ฃผ์ด์ผํฉ๋๋ค.
INSTALLED_APPS = [
...
'users',
]
users/templates/users/mypage.html ํ์ผ์ ์์ฑํด์ค๋๋ค.
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
django-allauth์์ ์ ๊ณตํ๋ User ๋ชจ๋ธ์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์์ฑ์ ์ถ๊ฐํ๊ธฐ ์ํด์๋ User ๋ชจ๋ธ๊ณผ 1:1๋ก ๋์๋๋ ๋ค๋ฅธ ๋ชจ๋ธ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ง๊ธ์ฒ๋ผ ๊ธ ๋ชฉ๋ก๋ง ๋ณด์ฌ์ฃผ๊ธฐ์๋ ์ถ๊ฐํด์ผํ๋ ์์ฑ์ ์์ง๋ง ์์ผ๋ก ์ถ๊ฐํ ์์ฑ์ด ์๊ธธ ๊ฒ์ด๋ฏ๋ก user์ฑ์ ์์ฑํ์ ๋ Profile ๋ชจ๋ธ์ ๋ง๋ค์ด์ฃผ๊ณ ์์ํ๊ฒ ์ต๋๋ค.
1:1 ๋์์ด๋๊น OneToOneField๋ก ์ฐ๊ฒฐํด์ฃผ๊ณ , User๊ฐ ์ญ์ ๋๋ฉด ํด๋นํ๋ ํ๋กํ๋ ํจ๊ป ์ญ์ ๋๋๋ก on_delete=models.CASCADE๋ฅผ ์ค์ ํด์ฃผ์์ต๋๋ค.
๋ชจ๋ธ์ ์ถ๊ฐํ์์ผ๋ migrateํด์ค๋๋ค.
$ python manage.py makemigrations
$ python manage.py migrate
from django.shortcuts import render
from main.models import Blog
def mypage(request):
user = request.user
blogs = Blog.objects.filter(writer=user) # ๋ก๊ทธ์ธํ ์ ์ ์ด๋ฆ๊ณผ ๊ธ ์์ฑ์ ์ด๋ฆ์ด ๋์ผํ ๊ธ ํํฐ๋ง
return render(request, 'users/mypage.html', {'blogs':blogs})
main์ฑ์ Blog๋ชจ๋ธ์ importํด์ฃผ๊ณ , mypageํจ์๋ฅผ ์์ฑํฉ๋๋ค. user๋ ํ์ฌ ์์
์ค์ธ ์ ์ ์ด๊ณ , ๊ฒ์๊ธ์ Blog๋ชจ๋ธ์ ๊ฐ์ฒด๋ค ์ค์ ์์ฑ์๊ฐ ํ์ฌ ์ ์ ์ ๋ํํ๋ ๊ธ์ ํํฐ๋ง ํ์ฌ ๋ด์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ mypage.html๋ก renderํด์ฃผ๋ฉฐ, ์ด๋ ๋์
๋๋ฆฌ ์๋ฃํ์ผ๋ก blogs
์ ํํฐ๋งํ ๊ธ์ ๋ด์์ ๋ณด๋ด์ฃผ์ด์ผ mypage.html์์ blogs
๋ฅผ ์ธ์ํ์ฌ ๊ฒ์๊ธ์ ๋์์ค ์ ์๊ฒ ์ฃ .
users/urls.py
from django.urls import path
from . import views
app_name = "users"
urlpatterns = [
path('mypage/', views.mypage, name="mypage"),
]
users์ฑ๋ ์ฑ๋ง๋ค url์ ๊ด๋ฆฌํ๊ธฐ ์ํด urls.pyํ์ผ์ ์์ฑํ๊ณ url์ ์์ฑํด์ค๋๋ค. app_name๋ ๊น๋จน์ง ๋ง๊ณ ์ค์ ํด์ค์๋ค.
๊ทธ๋ฆฌ๊ณ basic/urls.py์ users ์ฑ์ urls.py๋ฅผ includeํด์ฃผ์ด์ผ ์ธ์ํ ์ ์๊ฒ ์ฃ .
urlpatterns = [
...
path('users/', include('users.urls')),
]
users/templates/users/mypage.html
{% extends 'base.html' %}
{% load static %}
{% block content %}
<div class="container">
<h1>{{user.username}}</h1>
<div>
{% for blog in blogs %}
<a href="{%url 'main:detail' blog.id%}">{{blog.title}}</a><hr>
{%endfor%}
</div>
</div>
{% endblock %}
์ด์ template์ ์์ฑํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ง๊ธ๊น์ง ํด์๋ ๊ฒ ์ฒ๋ผ base.html์ ์์๋ฐ๊ณ static๋ ์ฌ์ฉํ ์ ์์ผ๋ ํจ๊ป ์ ์ด์ฃผ์์ต๋๋ค. ํ
ํ๋ฆฟ ๋ณ์๋ฅผ ์ด์ฉํด ํ์ํ ๊ฐ๋ค์ ๋ถ๋ฌ์์ค๋๋ค. ๋จผ์ ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ ์ ์ด๋ฆ์ ๋์์ฃผ๊ณ ์ํด {{user.username}}
์ ์ ์ด์ฃผ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์๊น mypageํจ์์์ ํํฐ๋งํ์ฌ ๊ธ์ ๋ด์ blogs
๊ฐ ์์์ฃ . ์ด ๊ธ๋ค์ for๋ฌธ์ ์ด์ฉํด ํ๋์ฉ blog
๋ผ๋ ๋ณ์์ ๋ด์์ ๋์์ค๋๋ค. {{blog.title}}
์ ์ด์ฉํด์ ๊ฒ์๊ธ์ ์ ๋ชฉ๋ง ๋ณด์ฌ์ฃผ๊ณ , ํด๋ฆญํ๋ฉด main์ฑ์์ ์์ฑํด์ฃผ์๋ detail๋ก ์ด๋ํ๋๋ก ํด์ค๋๋ค. main์ฑ์ detailํจ์๋ id๊ฐ์ ์ธ์๋ก ๋ฐ์ id๊ฐ์ ํด๋นํ๋ ๊ธ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด์์ฃ . ๊ทธ๋์ ๊ฒ์๊ธ์ id๊ฐ๋ ๋๊ฒจ์ค๋๋ค.
๋ง์ง๋ง์ผ๋ก basic/templates/shared/_navbar.html์ mypage๋ก ์ด๋ํ๋ ๋งํฌ๋ฅผ ์ถ๊ฐํด์ค๊ฒ์.
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
{% if user.is_authenticated %}
<li><a class="dropdown-item" href="{%url 'users:mypage' %}">Mypage</a></li>
<li><a class="dropdown-item" href="{%url 'account_logout' %}">Logout</a></li>
{% else %}
<li><a class="dropdown-item" href="{% url 'account_login' %}">Login</a></li>
<li><a class="dropdown-item" href="{%url 'account_signup' %}">Signup</a></li>
{% endif %}
</ul>
๋ก๊ทธ์ธํ์ ๊ฒฝ์ฐ์ ๋ง์ดํ์ด์ง๋ก ์ด๋ํ๋ ๋งํฌ๊ฐ ์์ด์ผํ๋ฏ๋ก {% if user.is_authenticated %}
์ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.