ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] 태그 검색🔎기능 만들기
    프로그래밍/Django & Flask 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 %}
    반응형

    댓글

Designed by Tistory.