장고 게시글 태그만들기

Pywiki
Sam (토론 | 기여)님의 2022년 5월 12일 (목) 10:54 판 (Sam님이 게시글 태그만들기 문서를 장고 게시글 태그만들기 문서로 이동했습니다)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
둘러보기로 가기 검색하러 가기

1 개요

게시글에 붙는 태그 만들기.

2 게시글에 태그 달기

2.1 model.py 수정

과정 설명 코드
태그모델 생성 태그모델을 만든다.

속성은 필요에 따라.

class Tag(models.Model):
    name = models.CharField(max_length=32)
    def __str__(self):
        return self.name
게시글모델 변형 게시글 모델에 태그속성을 추가한다.
class Posting(models.Model):
    ...
    tag = models.ManyToManyField('Tag', null=True, blank=True)  # 태그 모델과 연결.
    ...
admin.py 수정 관리자창에서 볼 수 있게 수정해주자.
class TagAdmin(admin.ModelAdmin):
    list_display = ('name',)
admin.site.register(Tag, TagAdmin)
DB반영 app에 대하여 DB에 반영한다. python manage.py makemigrations app

python manage.py migrate app

2.2 form.py 수정

취향에 따라 다르겠지만, 나는 form에 추가하지 않고 진행하겠다. post로 들어온 데이터값을 그대로 사용하고자 한다.

2.3 view.py 수정

과정 설명 코드
태그생성함수 짜기 request와 posting을 받아 태그를 생성하는 함수를 짠다.
def tag_adding(request, posting):
    tags = request.POST.get('tag').split(',')
    for tag in tags:
        if not tag:
            continue
        else:
            tag = tag.strip()  # 문자열 양쪽에 빈칸이 있을 때 이를 제거한다.
            tag_, created = Tag.objects.get_or_create(name=tag)  # created엔 새로 만들어졌는지 여부가 True로 나오고, tag_엔 그 태그가 담긴다.
            posting.tag.add(tag_)
기존 함수 변형 게시글을 만들고 수정하는 뷰를 변형한다.
        if form.is_valid():  #문제가 없으면 다음으로 진행.
            ...
            posting.save()
            tag_adding(request, posting)  # 태그 추가 함수.

2.4 template 수정

과정 설명 코드
게시글 생성 탬플릿 게시글 생성, 수정 시 태그를 입력하게 한다.
<label>태그 추가</label>
    <input type="text" class="form-control" name="tag" id="tag" placeholder="구분은 ','로 합니다.">
        {% for tag in posting.tag.all %}
        <span>
        <a href="">
        #{{ tag.name }}</a>
        {% endfor %}
추가하는 칸 아래엔 기존에 추가된 태그를 보여준다.
게시글 탬플릿 게시글에서 태그를 표시한다.
                    <!---태그 추가 부분-->
            <labe for = "tags">태그</labe>
            {% for tag in posting.tag.all %}
        <span>
                <a href="{% url 'scientific_humor:tag_info' tag.name %}">
                    #{{ tag.name }}</a>
            {% endfor %}

3 태그 삭제