[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 13 회차 미션

2020. 11. 14. 15:38Coding/Python-Fastcampus

728x90

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()로 저장을 한 다음에 넣어야 한다.

 

 

 

올인원 패키지 : 파이썬 웹 개발👉https://bit.ly/33a7nvc

728x90