2020. 11. 14. 15:38ㆍCoding/Python-Fastcampus
05. 게시판 - 05. 리뷰 및 프로젝트 보완
Home 화면 만들기.
1. login.html을 복사해서 home.html을 만든다.
2. 버튼을 적당히 배치해둔다.
3. home.html에서 {% if request.session.user %}을 사용해서 로그인,회원가입 또는 로그아웃 버튼이 출력되게 만든다.
4. 만든 버튼에 onclick="location.href = '/주소/주소' " 를 이용해서 연결을해준다.
home.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
{% extends "base.html" %}
{% block contents %}
<div class="row mt-5">
<div class="col-12 text-center">
<h1>홈페이지</h1>
</div>
</div>
<div class="row mt-5">
{% if request.session.user %}
<div class="col-12">
<button class="btn btn-primary btn-block" onclick="location.href='/fcuser/logout'">로그아웃</button>
</div>
{% else %}
<div class="col-6">
<button class="btn btn-primary btn-block" onclick="location.href='/fcuser/login'">로그인</button>
</div>
<div class="col-6">
<button class="btn btn-primary btn-block" onclick="location.href='/fcuser/register'">회원가입</button>
</div>
{% endif %}
</div>
<div class="row mt-1">
<div class="col-12">
<button class="btn btn-primary btn-block" onclick="location.href='/board/list'">게시물 보기</button>
</div>
</div>
{% endblock %}
|
cs |
fcuser의 views.py
1
2
|
def home(request) :
return render(request, 'home.html')
|
cs |
5. views에서 render롤 home.html연결.
board 페이지 연결.
1. board에서 만들어놓기만한 버튼들에 onclick=" location.href='/주소/주소' "로 연결.
board 페이지의 게시글 연결.
1
2
3
4
5
6
7
8
9
10
|
<tbody class="text-dark">
{% for board in boards %}
<tr onclick="location.href='/board/detail/{{ board.id }}'">
<th>{{board.id}}</th>
<th>{{board.title}}</th>
<th>{{board.writer}}</th>
<th>{{board.registered_dttm}}</th>
{% endfor %}
</tbody>
|
cs |
1. <tr> 혹은 <th>의 title부분에 onclick을 달아준다.
2. 게시글 번호는 for문의 board의 id로 받아오면된다.
06. 태그 - 01. 태그 만들기 - 1 - MN모델링
tag app 생성.
>python manage.py startapp tag
models.py 작성.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from django.db import models
# Create your models here.
class Tag(models.Model) :
name = models.CharField(max_length=32, verbose_name="태그명")
registered_dttm = models.DateTimeField(auto_now_add=True, verbose_name='등록시간')
def __str__(self):
return self.name
class Meta :
db_table = 'fastcampus_tag'
verbose_name = '패스트캠퍼스 태그'
verbose_name_plural = '패스트캠퍼스 태그 목록'
|
cs |
admin.py 작성.
1
2
3
4
5
6
7
8
|
from django.contrib import admin
from .models import Tag
# Register your models here.
class TagAdmin(admin.ModelAdmin) :
list_display = ('name',)
admin.site.register(Tag, TagAdmin)
|
cs |
프로젝트의 settings에 등록.
tag를 migration하기.
>python manage.py makemigration
>python manage.py migrate
게시물에 태그 출력.
앞서 models에 tags를 넣어놨기 때문에 html에서 바로 불러와서 사용할 수 있다.
board_detail.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
{% extends 'base.html' %}
{% block contents %}
<div class="row mt-5">
<div class = "col-12">
<div class='form-group'>
<label for="title">제목</label>
<input type="text" class="form-control" id="title" value="{{ board.title }}" readonly/>
<label for="contents">내용</label>
<textarea class="form-control" readonly>{{ board.contents }}</textarea>
<label for="tags">태그</label>
<span id="tags">
{{ board.tags.all }}
</span>
</div>
<button class="btn btn-primary" onclick="location.href='/board/list'">돌아가기</button>
</div>
</div>
{% endblock %}
|
cs |
{{ board.tags.all }}로 불러오면 Query Set으로 받아진다.
Query Set 활용.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
{% extends 'base.html' %}
{% block contents %}
<div class="row mt-5">
<div class = "col-12">
<div class='form-group'>
<label for="title">제목</label>
<input type="text" class="form-control" id="title" value="{{ board.title }}" readonly/>
<label for="contents">내용</label>
<textarea class="form-control" readonly>{{ board.contents }}</textarea>
<label for="tags">태그</label>
<span id="tags">
{% for tag in board.tags.all %}
{{ tag.name }},
{% endfor %}
</span>
</div>
<button class="btn btn-primary" onclick="location.href='/board/list'">돌아가기</button>
</div>
</div>
{% endblock %}
|
cs |
이런식으로 for를 이용하면 하나씩 불러와서 사용할 수 있다.
label의 태그 글씨와 tags에서 불러온 태그1, 태그2가 정상적으로 출력됨을 알 수 있다.
하지만 , 로 끝나고 label과 tags가 구분이 안된다.
join 활용.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
{% extends 'base.html' %}
{% block contents %}
<div class="row mt-5">
<div class = "col-12">
<div class='form-group'>
<label for="title">제목</label>
<input type="text" class="form-control" id="title" value="{{ board.title }}" readonly/>
<label for="contents">내용</label>
<textarea class="form-control" readonly>{{ board.contents }}</textarea>
<label for="tags">태그</label>
<span id="tags" class="form-control">
{{ board.tags.all|join:","}}
</span>
</div>
<button class="btn btn-primary" onclick="location.href='/board/list'">돌아가기</button>
</div>
</div>
{% endblock %}
|
cs |
span에 class를 줘서 tags를 구분하고,
{{ board.tags.all|join:","}} 라는 join함수를 활용해서 좀 더 깔끔하게 태그를 정리했다.
06. 태그 - 02. 태그 만들기 - 2
글쓰기에서 태그 사용하기(1) - 태그 출력.
태그를 입력할 칸을 만들어야한다.
글쓰기 페이지는 forms.py에서 만들었으니 forms에서 태그 칸을 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from django import forms
class BoardForm(forms.Form) :
title = forms.CharField(
error_messages={
'required':'제목을 입력해주세요.'
},
max_length=128, label="제목")
contents = forms.CharField(
error_messages={
'required':'내용을 입력해주세요'
},
widget=forms.Textarea, label='내용')
tags = forms.CharField(
required=False, label="태그")
|
cs |
required를 False로 줘서, 필수값이 아니게끔 한다.(입력하지 않아도 글쓰기를 할 수 있다)
글쓰기에서 태그 사용하기(1) - 태그 등록.
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
from tag.models import Tag
def board_write(request) :
if not request.session.get('user') :
return redirect('/fcuser/login')
if request.method == 'POST' :
form = BoardForm(request.POST)
if form.is_valid() :
user_id = request.session.get('user')
fcuser = Fcuser.objects.get(pk = user_id)
board = Board()
board.title = form.cleaned_data['title']
board.contents = form.cleaned_data['contents']
board.writer = fcuser
board.save()
tags = form.cleaned_data['tags'].split(',')
for tag in tags :
if not tag :
continue
_tag, _ = Tag.objects.get_or_create(name=tag)
board.tags.add(_tag)
return redirect('/board/list/')
else :
form = BoardForm()
return render(request, 'board_write.html', {'form':form})
|
cs |
tags에 입력한 문자 내용을 받아서 , 로 구분하여 하나씩 나눠 담는다.
주요 포인트는 _tag, _ = Tag.objects.get_or_create(name=tag)
get_or_create() 함수는 태그가 있는 경우 불러오고, 없는 경우엔 생성을 해서 등록시키는 함수다.
_tag는 불러오거나 만든 태그를 받는 변수고,
_는 get을 했는지 create를 했는지 구분하는 변수인데, 지금은 구분할 필요가 없어서 안쓴다는 의미의 언더바_를 넣었다.
그리고 태그는 .add()로 추가하기 때문에 board.save()로 저장을 한 다음에 넣어야 한다.
'Coding > Python-Fastcampus' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 15 회차 미션 (0) | 2020.11.16 |
---|---|
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 14 회차 미션 (0) | 2020.11.15 |
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 12 회차 미션 (0) | 2020.11.13 |
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 11 회차 미션 (0) | 2020.11.12 |
[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 10 회차 미션 (0) | 2020.11.11 |