검색 기능 구현하기
상단 nvbar 안에 있는 검색창으로 회원가입한 유저에 닉네임,게시글이 나오는 검색기능을 만들어야함
우선 검색하는 정보가 db안에 들어갈 수 있게 models.py 에서 만들어준다.
!! 반드시 모델을 만들고 나서는 migrations , migrate 해주기
class Feed(models.Model):
content = models.TextField() # 글내용
image = models.TextField() # 피드 이미지
user_id = models.TextField() # 닉네임
like_count = models.IntegerField()
profile_image = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Feed라는 정보를 담는 테이블을 만들어주고 안에 열도 만들어주었다.
모델을 만들어주었기 때문에 다음엔 urls.py에서 url을 지정해줘야한다. 함수는 아직 기능을 만들지 않았기 때문에 url과 함수 이름을 미리 지정해준다.
!! 상단에 from . import views 해서 view를 끌어오는걸 잊지말기
path('search/', views.search,name='search')
search 라는 url을 연결해주고 views 안에 search라는 함수를 연결해준다 물론 아직 함수는 없기 때문에 view안에 만들어줘야한다.
def search(request):
searched = request.POST.get('q', "")
if q:
searched = Feed.objects.filter(Q(user_id__icontains=q) | Q(content__icontains=q))
return render(request, 'searched.html',{'searched':searched, 'q': q }
해석하자면 searched 라는 변수안에 POST 매소드로 들어온 정보를 담은 q값을 넣어주는것이다.
따라서 만약에 q가 존재한다면 (POST로 온 정보가 검색된다면) 검색한 정보안에 Feed 테이블안에 있는 user_id 와 content를 포함하고 있는 것을 필터(여기서 __icontains는 검색한 값을 조금만 포함해도 관련 정보들을 골라준다) 해서 searched 안에 담아주고 searched.html이라는 탬플릿(화면)안에 정보를 넣어준다. 뒤에 대괄호는 키와 밸류값 처럼 딕셔너리형으로 정보를 전달하다는 의미이며 앞에 'searched'는 탬플릿 출력에 사용할 변수 이름이고 뒤에 : searched 는 위에 검색결과를 담은 변수이다. 전자는 html에 맞게 이름을 마음대로 바꿔서 저장해도 상관없다
마지막으로 결과값만 볼 수있는 테스트용 html 만들기
탬플릿안에 searched.html을 만들어주고 다음과 같은 코드를 집어넣어준다. 위에 views에서 searched라고 이름을 저장했기 때문에 탬플릿 문법으로 출력할때도 searched라고 적어서 사용해줘야 정보가 받아진다.
{% block content %}
{% if searched %} {% comment %}만약, 검색창에 입력한 값이 있다면 이라는 의미입니다. {% endcomment %}
<h1> 검색하신 {{ searched }} 정보입니다. </h1>
{% for search in searched %}
{{ search.user_id }} <br> ## 닉네임정보
{{ search.content }} ## 게시글정보
{% endfor %}
{% else %} {% comment %} 검색창에 아무것도 입력하지 않았을 경우 뜨는 메시지입니다. {% endcomment %}
찾고 있는 이름을 검색창에 입력해주세요.
{% endif %}
{% endblock %}
출력값을 확인하고 본격적으로 다음에는 게시글 작성 함수안에 tag도 작성할 수 있게 수정할 것이다.