[REAL Python – Django] – “Django – tag 텍스트로 추가”

[REAL Python – Django] – “Django – tag 텍스트로 추가”

3월 26, 2022

templates 수정

HTML 코드를 추가해줍니다. 사실 이 포스트는 안 하려 했는데, 왜인지 구현하던 중 에러가 자꾸 나서 천천히 기록해 봅니다.

            <tr>
                <th><label for="id_tags_str">Tags:</label></th>
                <td><input type="text" name="tags_str" id="id_tags_str"></td>
            </tr>

views.py 수정

태그를 지정할 때에 태그1; 태그2; 태그3; 처럼 필드에 입력하도록 할 겁니다. 정리 겸 함수의 코드에 주석을 달아 놓았습니다.

    def form_valid(self, form):
        current_user = self.request.user
        if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
            form.instance.author = current_user
            response = super(PostCreate, self).form_valid(form)

            # 사용자가 태그를 입력하면 그것을 읽어온다.
            tags_str = self.request.POST.get('tags_str')
            if tags_str: # 읽어온 태그가 채워져 있다면..
                tags_str = tags_str.strip()

                #태그들을 ;로 나눔
                tags_str = tags_str.replace(',', ';')
                tags_list = tags_str.split(';') # 리스트를 리턴

                for t in tags_list:
                    t = t.strip()
                    # get_or_created는 태그 객체와 태그가 생성되었는지를 리턴(bool값)
                    tag, is_tag_created = Tag.objects.get_or_create(name=t)
                    if is_tag_created: # 태그가 생긴 것이 맞다면..
                        tag.slug = slugify(t, allow_unicode=True) # 슬러그를 새로 생성
                        tag.save()
                    self.object.tags.add(tag) # 태그 필드에 추가

            return response

        else:
            return redirect('/blog/')

여기서 생긴 오류?

첫째, 어드민 페이지에서 태그를 추가하면 성공적으로 추가됩니다. 의심스러운 것은 태그 부분에 빈 태그가 만들어졌다는 것?

그런데 블로그의 포스트 생성 기능을 눌러서 사용을 하려고 하면 위와 같은 오류가 납니다. 태그의 슬러그 자체는 꼭 하나여야 하는데, 이미 생성된 태그의 슬러그를 다시 만드려고 해서 발생하는 문제입니다.

git으로 버전을 위로 돌린 다음, DB를 초기화하기로 결정했습니다. (sqlite3 제거, migrations 아래의 init 제외 모두 삭제)

해결? – 빈 태그가 만들어지는 것

tags_str = "러스트; 파이썬, js; 자바 스크립트;"
print("원본|", tags_str)

tags_str = tags_str.strip() # 양쪽의 공백 제거
print("공백제거후|", tags_str)

# if tags_str[-1] == ";":
#     tags_str = tags_str[:-1]

tags_str = tags_str.replace(',', ';')  # , 를 ; 로 대체
print("대체 후|", tags_str)

tags_list = tags_str.split(';')  # ;를 기준으로 나눔
print("나눈 후|", tags_list)

for t in tags_list:
    t = t.strip()
    print(t)
    
    
# 원본| 러스트; 파이썬, js; 자바 스크립트;
# 공백제거후| 러스트; 파이썬, js; 자바 스크립트;
# 대체 후| 러스트; 파이썬; js; 자바 스크립트;
# 나눈 후| ['러스트', ' 파이썬', ' js', ' 자바 스크립트', '']
# 러스트
# 파이썬
# js
# 자바 스크립트
# 

태그의 끝에 ; 가 붙어있으면, 그것을 기준으로 나누는데 빈 태그가 나오는 문제가 발생, 만약 폼에서 읽어온 태그들의 끝에 ; 가 붙어있다면 그것을 제거해 주는 것으로 해결했습니다. 빈 태그가 없으면 기능은 모두 정상적으로 동작합니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.