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/