"오늘은 장고 3주차 강의를 보았다.
3주차에서 배운 내용들을 정리해보자"
용어
request()
url을 통해 form에 입력한 데이터를 가지고 있다
render(): 장고의 패키지 함수다
사용: html 파일을 화면에 띄울때 사용한다/data를 보낼때 사용된다
render는 request와 template_name을 반드시 적어주어야 한다
context로(딕셔너리형) view 에서 사용하던 파이썬 변수를 html 템플릿으로 넘길 수 있다
render(request, template_name)
redirect()
사용: 해당 함수가 호출 되었을 떄 지정한 경로, url로 이동시키는 역할을 한다
redirect는 내가 가진 templates 뿐 아니라 절대 url로 이동하고 싶을 때 사용한다
이때 url로 이동한다는 말은, 그 url과 연결된 views가 다시 실행되고
또 이에 따른 return값이 존재하게 된다는 의미이다
상속
class에서 상속은 함수의 매개변수와 비슷하게 생겼다
원래 지금 내가 사용하고 있는 class에서는 다른 class의 기능을 사용하지 못하지만
상속하고 싶은 class("상속") 이름을 넣어주면 다른곳에 있는 class의 기능들도 사용 가능하다
from django.db import models
# 상속할 클래스 import 해주기
from django.contrib.auth.models import AbstractUser
# AbstractUser는 상속하고 싶은 클래스의 이름
class UserModel(AbstractUser):
class Meta:
db_table = "my_user" # 여기는 테이블 이름이에요! 꼭 기억 해 주세요!
# 여기에는 보이지 않지만 AbstractUser 클래스가 있고
# AbstractUser 의 클래스 플러스 아래에 다른 클래스를(아래에는 bio) 덧붙일 수 있다
bio = models.TextField(max_length=500, blank=True)
- 바꾼 이후에 할일
1. 장고에게 알려준다
# settings.py
AUTH_USER_MODEL = 'user.UserModel'
2. db에 모델을 적용시켜 준다
모델 구성은 가능하면 처음에 잘 구성해서 구성한 그대로 계속 사용하도록 하자
python manage.py makemigrations
python manage.py migrate
HTML의 url 만들기
1. HTML 파일을 만든다
파일명은 home.html이라고 정하겠다.
2. HTML을 url을 만들어준다
url은 view.py에서 작성한다
from django.shortcuts import render
def home(request):
user = request.user.is_authenticated # 사용자가 로그인 했는지' 검사 해 주는 코드다.
if user:
# url 주소 만듬
return redirect('/tweet')
3. 자신의 앱에 urls.py가 없다면 url.py를 만들어 주고 방금 만든 url주소를
from django.urls import path
from . import views
urlpatterns = [
# 127.0.0.1:8000 과 views.py 폴더의 home 함수 연결
path('', views.home, name='home'),
# 127.0.0.1:8000/tweet 과 views.py 폴더의 tweet 함수 연결
path('tweet/', views.앱 이름, name='tweet(그냥 이름????)')
]
4. 매인 폴더에 방금 만든 url.py 파일을 등록해준다
# 매인/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('전에 먼저 등록한 url.py')),
# 지금 등록
path('', include('앱 이름.urls'))
]
HTML 화면에 사용자 이름 띄우기
1. 사용자 이름을 띄울 html 파일을 선택하고 {{ "여기에 사용자 이름 넣기 "}} 사용자 이름을 넣는다. 끝...
<div class="col-md-3">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ user.username }}</h5>
</div>
</div>
</div>
로그인 되었을때만 보여주고 싶으면 if문을 사용하면 된다
<!-- templates/base.html -->
... 생략
</div>
<form class="form-inline my-2 my-lg-0">
# if 유저가 아니라면 그냥 html 페이지가 나온다
{% if not user.is_authenticated %}
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/sign-in"> Sign In <span class="sr-only"></span></a>
</li>
<li class="nav-item active">
<a class="nav-link" href="/sign-up"> Sign Up <span class="sr-only"></span></a>
</li>
</ul>
# 유저라면 {{ 유저 이름 }} + 반갑습니다 정도 써주자
{% else %}
{{ user.username }} 님 반갑습니다!
{% endif %}
</form>
... 생략
로그아웃 기능
1. view.py에 로그아웃 함수를 만든다
auth.logout() 라는 장고 내장 함수를 사용해서 로그아웃을 해보자
from django.contrib.auth.decorators import login_required
@login_required
def logout(request):
auth.logout(request) # 인증 되어있는 정보를 없애기
return redirect("/") # 로그아웃되면 url '/'로 이동
2. url.py에 로그아웃 url을 추가해준다
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
# 로그아웃 url
path('logout/', views.logout, name='logout')
]
3. 로그아웃 url로 이동 할 수 있도록 HTML에 a태그를 넣어준다
<a class="nav-link" href="/logout"> 로그아웃 </a>
게시글 작성 기능
1. html에 게시글 글을 작성할 곳을 만들어 준다
from태그 안에 button type = "submit"을 만들어주고, 글을 작성하려 하니 <textarea> 태그를 사용하자
여기서 중요한건 <textarea> 태그를 사용하고 태그의 name과 id를 기억해야 한다
DB에서 작성했던 게시글들 가져오기
1. views.py의 get 부분을 수정한다
보여주는 부분이니 views.py를 수정하고 데이터를 가져와야 하니까 get 부분을 수정한다
# tweet/views.py
def tweet(request):
if request.method == 'GET': # 요청하는 방식이 GET 방식인지 확인하기
user = request.user.is_authenticated # 사용자가 로그인이 되어 있는지 확인하기
if user: # 로그인 한 사용자라면
# 데이터를 생성된 시간의 역순으로 불러오는 코드(최신순 정렬을 구현할때 사용)
all_tweet = TweetModel.objects.all().order_by('-created_at')
# html화면 띄우고 딕셔너리 형태의 key값인 tweet을 html에 보낸다
return render(request, 'tweet/home.html', {'tweet': all_tweet})
else: # 로그인이 되어 있지 않다면
return redirect('/sign-in')
2. html을 수정한다
db에서 가져온 정보를 내가 원하는곳에 보여주기 위해 보여주고 싶은 부분을 수정한다
게시글이 리스트로 전달되기 때문에 for문을 사용해 출력한다
<!-- templates/tweet/home.html -->
<hr>
<!-- 작성 된 글이 나오는 곳 -->
<div class="row">
# 딕셔너리 key 값인 tweet을 for문으로 돌려준다
{% for tw in tweet %}
<div class="col-md-12 mb-2">
<div class="card">
<div class="card-body">
<div class="media">
<div class="media-body">
# 이건 html의 name? id?
<h5 class="mt-0">{{ tw.content }}</h5>
</div>
<div style="text-align: right">
# 이건??
<span style="font-size: small">{{ tw.author.username }}-{{ tw.created_at|timesince }} 전</span>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
댓글