프로그래밍/Django & Flask
[Django] 태그 검색🔎기능 만들기
대인보우
2020. 11. 28. 16:31
반응형
🔫완성작🔫
✨ models.py
# 게시글
class Post(models.Model):
# ....
tagging = models.ManyToManyField(Tag, related_name='tagged')
# 태그
class Tag(models.Model):
tag_content = models.CharField(max_length=30)
Tag 클래스 생성 후 게시글과 M:N 관계를 설정해준다.
✨ urls.py
# 해시태그
path('hashtag/', views.hashtag, name="hashtag"),
✨main.html (templates)
# 검색창에 키워드 입력하면 hashtag로 연결
<form method='post' action='{% url 'hashtag' %}'>
{% csrf_token %}
<input type="" name="search_button" value="검색" style="background-color: rgb(242, 242, 242)">
</form>
✨ views.py
# 게시글 생성 시 태그를 따로 저장해주기 위해 수정
def create(request):
if request.method == "POST":
form = PostForm(request.POST, request.FILES)
if form.is_valid():
# 게시글 저장
user = MyUser.objects.get(id=request.user.id)
post = form.save(commit=False)
post.posting_writer = user
post.save()
# 태그처리
content = request.POST.get('posting_content') # 본문을 content에 저장
c_list = content.split(' ') # 공백으로 분리
for c in c_list:
if '#' in c: # 만약 #이 붙어있으면 tag 객체를 이용하여 저장한다
tag = Tag()
tag.tag_content = c
tag.save()
post_ = Post.objects.get(pk=post.pk)
post_.tagging.add(tag)
return redirect('/')
else:
return redirect('create')
elif request.method == "GET":
form = PostForm()
return render(request, 'post/create.html', {'form':form})
# 해쉬태그 검색
#hash tag 검색
def hashtag(request):
if request.method == 'POST':
keyword = request.POST.get('search_button') # keyword를 입력받음
tag = Tag.objects.filter(tag_content=keyword) # 해당 키워드를 가진 tag 클래스 오픈
post= Post.objects.filter(tagging__in = tag).order_by('-posting_date') # 해당 태그를 가진 post 저장
#if post:
# post_ = post[0]
#else:
# post_ = None
return render(request, 'post/search_result.html', {'post':post, 'keyword':keyword})
elif request.method == 'GET':
return redirect('/')
✨ search_result.html
# 게시글 출력
{% block content %}
<div class="content">
<div id="hashtag_posting">
{% if post_ %}
<img id="photo" src="{{ post_.posting_photo.url }}">
{% else %}
<img id="photo"">
{% endif %}
<div id="hashtag">{{ keyword }}</div>
<div id="hashtag_count">게시글 {{ post.count }}개</div>
</div>
<br>
<br>
<br>
<div id="title">{{ keyword }}과 관련된 게시물</div>
<div class="image_box">
{% for post in post.all %}
<img id="image_box" src="{{ post.posting_photo.url }}">
{% endfor %}
</div>
</div>
{% endblock %}
반응형