장고로고

[django] model.objects.filter를 이용한 검색기능 추가

django에서 model.objects.filter를 이용해 제목, 본문을 검색할 수 있는 기능을 추가하려고 한다.

#index.html

<form class="form-inline" action="{% url 'blog:index' %}" method="get">
    <div class="input-group">
        <select name="fd_name" id="" class="form-control">
            <option value="title">title</option>
            <option value="content">content</option>
        </select>
        <input type="text" class="form-control" name='q'>
        <button class="btn btn-secondary" type="submit">Search</button>
    </div>
</form>
#vew.py

def index(request):
    if request.GET.get('q'):
            variable_column = request.GET.get('fd_name')
            search_type = 'contains'
            filter = variable_column + '__' + search_type
            posts = Post.objects.filter(**{ filter: request.GET.get('q') }).order_by('-published_date')
    return render(request, 'blog/index.html', {
        'posts': posts,
    })

맨처음에는 Post.objdects.filter(requests.GET.get(‘q’)+’__contains’ = requests.GET.get(‘q’))으로 시도를 했지만 에러를 냈다. 문자열로 받아드리기 때문에 장고에서 필드명을 찾지 못하는것 같았다.

modesl.objects.fillter(**kwargs)로 인자를 받기때문에 문자열이 아닌 딕셔너리 **{key:value}로 인자를 전달해서 문제를 해결했다.

참고 사이트
https://docs.djangoproject.com/en/2.1/topics/db/queries/
https://stackoverflow.com/questions/4720079/django-query-filter-with-variable-column
https://wayhome25.github.io/django/2017/05/04/django-queryset-search/

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다