[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
# 자바 스크립트
#
태그의 끝에 ;
가 붙어있으면, 그것을 기준으로 나누는데 빈 태그가 나오는 문제가 발생, 만약 폼에서 읽어온 태그들의 끝에 ;
가 붙어있다면 그것을 제거해 주는 것으로 해결했습니다. 빈 태그가 없으면 기능은 모두 정상적으로 동작합니다.