프로그래밍/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 %}
반응형