티스토리 뷰

게시판 기능 중에 태그 기능 추가하기 

 

1. 터미널 창에  "python manage.py startapp tag " 입력

그러면 tag 라는 이름의 앱이 생기고 관련 파일들이 생성된다.

 

2. models.py 에서 객체 설정하기

 

3. admin.py 에서 관리자 페이지에 어떻게 나타낼 것인지 지정

 

4. 새로 생성한 모델에 대해서 migrate 실행

python manage.py makemigrations

python manage.py migrate

 

5. 이 태그 기능은 게시판에서 사용될 것이므로 게시판 app과 연결해야한다.

board 의 models.py로 들어가서 tag를 객체에 추가한다. 

태그는 여러 개 사용할 수 있고 여러 사람이 사용하므로 다대다 필드 설정

board 모델이지만 tag 모델에 있는 값 참조하므로 tag.Tag

 # N:M (다대다) => ManyToManyField

    tag = models.ManyToManyField('tag.Tag', verbose_name='태그')

 

6. 게시판 객체에 태그를 추가했으므로 이제 기능적인 측면에서 태그를 추가해야한다.

게시판에서 글을 쓸 때 태그를 입력하는 것, 게시글을 볼 때 태그도 같이 보여주는 것 

두 가지를 추가해야한다. 

 

6-1. 게시글을 볼 때 태그도 같이 보여주는 것

게시글을 보여주는 html에서 코드를 추가해야한다. 

제목, 내용을 보여주는 코드 밑에 태그 보여주는 코드 추가

 

            <label for = "tags">태그</label>

            <span id = "tags" class= "form-control">

                {{ board.tag.all|join:", "}}

                <!-- {% for tag in board.tag.all %}

                    {{ tag.name }},

                {% endfor %} -->

            </span>

 

6-2. 게시판에 글을 쓸 때 태그를 입력하는 것

글을 쓰는 함수 views.py에서 board_write 함수에서 추가해야한다.

 

여기서 주의해야 할 점이 있다.

게시글 객체 Board()를 생성하고 그 안에 제목, 내용, 작성자를 담고 board.save()를 통해서 저장했다. 

이 때, 태그는 게시글에 추가되는 것이므로 이미 board가 완성된 상태에서 추가되어야한다.

board 객체가 생성되고 나면 id 가 부여되는데 그 id를 이용해서 태그 추가 

 

또한, 기존에 있는 태그인 경우와 새로운 태그인 경우를 나눠서 구현해야한다.

이미 존재한다면 그냥 가져오고 그게 아니라면 새로 생성한다. 

         board.save()

         tags = form.cleaned_data['tag'].split(",")

            for tag in tags:

                    # 태그가 없다면

                if not tag:

                    continue

 

                # 기존에 있는 태그인 경우, 새로운 태그인 경우 나눠서 구현

                # Tag 에서 이름이 tag인 것이 존재한다면 가져오고 아니면 새로 생성. 어쨋든 어떤 값은 가져온다.

                # tag_ 변수에는 생성된 객체(클래스 변수) created 에는 새로 생성된건지 아닌지 여부 Boolean 값 가짐.

                tag_ , created = Tag.objects.get_or_create(name=tag)

                board.tag.add(tag_)

 

cleaned_data

cleaned_data를 계속 쓰는데 어떤 용도인지 모르겠다. 

그냥 form 에서는 cleaned_data , model Form에서는 save() 

save와 비슷한 기능을 하는 것. 기존의 forms.Form에 있던 clean 함수 ?

 

ModelForm 과 Form 일 때의 차이인 것 같다. 아래의 글을 참고하면 좋을듯 

https://github.com/YeongBaeeee/practice/wiki/18-ModelForm-&-Form-Validation

 

YeongBaeeee/practice

Contribute to YeongBaeeee/practice development by creating an account on GitHub.

github.com

 

 

댓글