해야할 일
- 검색 기능 구현하기
- core 에 있는 모델 다른 앱으로 이동시키기 (생각 없이 몰빵함...)
☝🏻 질문정리
메인 페이지에서 특정 워딩을 검색바에서 입력을 했을 때
<http://localhost:8000/search/?q=특정 워딩> 처럼 url를 구성하고
특정 워딩이 포함되어있는 포스팅만 메인 페이지에 띄우게 하고 싶습니다
메인 페이지에서 특정 키워드를 검색바에 입력후 검색할 경우
특정 URL (<http://localhost:8000/search/?q=특정 워딩> ) 페이지로 이동하고
검색시 입력한 특정 키워드가 포함되어있는 포스팅만 해당 페이지에 띄우고 싶습니다
☝🏻 검색 기능 구현하기
1. views.py 수정하기
템플렛에 form get 메소드로 요청받아 view에서 form의 값들이 get으로 넘어와 url 뒤에 <http://localhost:8000/search/?q=특정 워딩> 와 같은 형식으로 파라미터들을 받아 request 객체에 있는 get 은 딕셔너리 형으로 반환하여 저장
request.GET.get('파라미터', '')과 같은 형식으로 파라미터를 전달 받고 쿼리 필터를 적용하기
# room/views.py
from django.views.decorators.csrf import csrf_exempt
from django.db.models import Q
from django.shortcuts import render, redirect
#모델 가져오기
from room.models import Posting
@csrf_exempt
def search(request):
search_keyword = request.GET.get('q', None) # core/templates/nav.html
res_data = {}
if search_keyword: # 키워드 검색이 들어왔을때만 작동
posting_list = Posting.objects.all().order_by('-id') #최신순
search_posting_list = posting_list.filter(Q (title__icontains=search_keyword) | Q (sub_title__icontains=search_keyword) | Q (content__icontains=search_keyword))
res_data['posts'] = search_posting_list
return render(request, "main.html", res_data)
- from django.views.decorators.csrf import csrf_exempt
django에서 post, put, delete 방식 사용을 위해서는 csrf 을 끈다.
api를 만들 경우 csrf 보안이 필요하지 않다. API 서버는 API key 등 다른 인증 방식을 사용한다
그래서 crsf를 끌 필요가 있다
[ @csrf_exempt ] 를 추가하지 않을 경우에는 csrf token이 필요하다는 에러가 뜨면서 post, put, delete가 작동하지 않는다.
2. url 연결
# room/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('room_add/', views.room_add, name='room_add'), # 모집글추가페이지
path('room/<int:id>/', views.room_page, name='room_page'), #모집글상세페이지
path('search/',views.search, name="search"), #검색
]
3. templates 수정
# core/templates/nav.html
<form class="form fixed-top" action="{% url 'search' %}" method="get">
...
<!-- {% csrf_token %} -->
<div class="relative text-gray-600 " style="background: #fff; padding: 5px 10px; width: 50%; display: flex; border-radius: 2rem; justify-content: space-between;">
<input type="search" placeholder="스터디 모집 찾기"
class="form-control bg-white h-10 rounded-full text-left focus:outline-none" aria-label="Search"
name="q" value="{{ q }}" style="width:100%; text-align:center; ">
...
</form>
- form 의 action="{ % url 'search' % }" / method= "get"
form get 메소드로 요청받아 view로 가기 (위에 설명참고)
- input 의 name= "q" / value="{{ q }}" 로 설정하면 http://127.0.0.1:8000/search/?q= {{ q }}
room/views.py search 함수 < search_keyword = request.GET.get('q', None) >
# room/templates/room_list.html
<!-- 글 목록 출력 -->
{% if not posts %} # views.py search함수 res_data['posts']
<h1>결과없음</h1>
{% endif %}
{% if posts %}
{% for p in posts %}
<div class="w-full h-64 flex flex-col justify-between bg-gray-50 bg-whsite rounded-lg border mb-6 py-5 px-4">
<div>
<h4 class="text-gray-800 dark:text-gray-900 leading-7 w-11/12 font-bold mb-3">{{ p.title }}</h4>
<p class="text-gray-600 dark:text-gray-900 text-sm">{{ p.content }}</p>
</div>
...
{% endfor %}
{% endif %}
- {% if not posts %}
views.py search함수 res_data['posts']
core/views.py 에 home 함수 res_data = { 'posts' : post_list }
posts 와 같은 변수명 사용하는게 좋다
다른 변수명으로 했을 경우 for문이 안돌아갈 수 있음
'FrameWork > Django' 카테고리의 다른 글
7월 20(수) 상세페이지 만들기 (0) | 2022.07.21 |
---|---|
7월 19일(화) (0) | 2022.07.20 |
7월 15일~17일(금/토/일) 글쓰기기능추가 (0) | 2022.07.18 |
7월 14일(목) 검색바 추가(기능x)/글쓰기 추가(기능x)/메인페이지에 글목록 가져오기 (0) | 2022.07.14 |
7월 13일(수) 포스팅 모델/admin/view (0) | 2022.07.14 |