190212
todolist
- app 2개 : account // todo
account - 회원가입 로직
todo - crud
todo
1
2
3
4
5
6
7
8
9
#todo urls.py
from django.url import path
from . import views
app_name = "todos"
urlpatterns = [
path("", views.list, name="list"),
]
1
2
3
4
5
#todo views.py
from django.shortcuts import render
def list(request):
return render(request, "todo/list.html")
1
# base.html은 todolist에 templates폴더내에 따로 만들어서 account와 todo가 같이 접근하게
1
2
3
4
5
6
7
8
#todo list.html
{% extends "base.html" %}
## setting.py에 TEMPLATES_DIR로 설정을 해줬으니까 접근이 쉬움
{% block bb %}
<h1>list page</h1>
{% endblock %}
account
1
2
3
4
5
6
7
8
9
#account urls.py
from django.url import path
from . import views
app_name = "accounts"
urlpatterns = [
path("signup/", views.signup, name="signup"),
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#account views.py
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
def signup(request):
if(request.method == "POST"):
form = UserCreationForm(request.POST)
if(form.is_valid()):
user = form.save()
auth_login(request, user)
return redirect("todos:list")
else:
form = UserCreationForm()
return render(request, "account/form.html", {"form":form})
1
2
# model설정 안해주고 migrate만 해주기
$ python manage.py migrate
1
2
3
4
5
6
7
#account signup.html
{% extends "base.html" %}
{% block bb %}
{% endblock %}
1
2
3
4
5
6
# base.html 추가
<ul>
<li><a href="{% url 'accounts:signup' %}">회원가입</a></li>
<li><a href="{% url 'accounts:login' %}">로그인</a></li>
<li></li>
</ul>
1
2
#account urls.py
path("login/", views.login, name="login"),
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#account views.py
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login
def login(request):
if(request.method == "POST"):
form = AuthenticationForm(request, request.POST)
if(form.is_valid()):
# form.save는 데이터베이스에 저장하는게 아니라 session에 저장
auth_login(request, form.get_user())
return redirect("todos:list")
else:
form = AuthenticationForm()
return render(request, "account/form.html", {"form":form})
1
2
3
4
5
6
7
8
9
10
11
12
# base.html 추가
<ul>
{% if user.is_authenticated %}
<p>로그인함!!!</p>
<p>{{user}}님 안녕하세요</p>
<li><a href="{% raw %}{% url 'accounts:logout' %}">로그아웃</a></li>
{% else %}
<li><a href="{% raw %}{% url 'accounts:signup' %}">회원가입</a></li>
<li><a href="{% url 'accounts:login' %}">로그인</a></li>
{% endif %}
<li><a href=""></a></li>
</ul>
- if문 : login 상태면 true
1
2
3
#account urls.py
path("logout/", views.logout, name="logout"),
1
2
3
4
5
6
#account views.py
from django.contrib.auth import logout as auth_logout
def logout(request):
auth_logout(request)
return redirect("accounts:login")
todo
1
2
3
4
5
6
7
8
9
10
#todo models.py
from django.db import models
from django.conf import settings
class Todo(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
def __str__(self):
return self.title
1
2
#todo urls.py
path("create/", views.create, name="create"),
1
2
3
4
5
6
7
8
9
10
11
12
#todo views.py
def create(request):
if(request.method == "POST"):
form = TodoModelForm(request.POST)
if(form.is_valid()):
todo = form.save(commit=False)
todo.user = request.user
todo.save()
return redirect("todos:list")
else:
form = TodoModelForm()
return render(request, "todo/create.html", {"form":form})
1
2
3
4
5
6
7
8
9
10
#todo forms.py
from django import forms
from .models import Todo
class TodoModelForm(forms.ModelForm):
class Meta:
model = Todo
# fields = '__all__' 로 해주면 사용자에게 모든 유저정보가 나타남
## list형태로 원하는 column만 넣을 수 있음
fields = ['title']
1
2
3
4
5
6
7
8
9
10
11
12
#todo create.html
{% raw %}{% extends "base.html" %}
{% block bb %}
<form method="POST">
{% csrf_token %}
<input type="submit" value="Submit"/>
</form>
{% endblock %}
- 로그인을 한 유저만 create할 수 있게
1
2
3
4
5
6
7
from django.contrib.auth.decorators import login_required
@login_required
def create(request):
# 데코레이터라는 이름으로 함수를 실행하기 전에 먼저 실행해줌
## 로그인을 했으면 그대로 create를 실행시키고 로그인이 안되어 있으면 로그인 페이지로 보여줌
1
2
3
4
5
# base.html
<li><a href="{% url 'todos:create' %}">글작성</a></li>
## 글작성을 눌러도 로그인이 안되어 있으면 해당 링크로 안넘어가짐
### @login_required의 기능
- list 페이지에 현재 로그인한 사람의 정보만 보주기
- 로그인 안한사람은 글도 못보게하기
1
2
3
4
5
6
7
#todo views.py 수정
@login_required
def list(request):
# todos = Todo.objects.all()
todos = request.user.todo_set
return render(request, "todo/list.html", {"todos":todos})todos = request.user.todo_set
delete
1
2
#todo urls.py
path("<int:id>/delete/", views.delete, name="delete"),
1
2
3
4
5
#todo views.py
def delete(request, id):
todo = Todo.objects.get(pk=id)
todo.delete()
return redirect("todos:list")
1
2
# list.html 추가
<a href="{% url 'todos:delete' todo.id %}">삭제</a>