웹페이지 업그레이드가 끝이 났다 ~! 얏호!
(5)에 이어서 이번에 시도했던 건
"JSON file 읽어와서 리스트로 만들기" 였다.
솔직히 이번꺼는 멘토님이 다 해주셨음... 크흠흠
마지막 멘토링이어서 그런지 원리를 설명해주시고 아예 코드를 다 짜주셨다.
JSON file을 읽어와서 리스트로 만드는 게 어려웠던 주요 원인은,
간단히 말하자면 내가 javascript로만 시도를 했기 때문이었다.
나는 JSON file이 뭐.. 인터넷에서 읽어오는 것도 아니고 동적 파일이니까,
CSS에서 이미지 파일 불러오듯이 javascript 내에서 불러오면 되는 거 아닌가? 라고 생각했지만...
아니었나보다... !
클라이언트가 동적파일 불러오듯이 불러올 수는 없고 통신을 하면서 파일을 읽어야 하는데, 그러려면
1. javascript에서 ajax 사용해서 불러오기
2. python에서 불러오기
두 가지 방법 중 하나를 사용해야 했다.
어떤 방법이 더 효율적이고 그런 건 없었지만 python이 더 쉬워서..? 직관적이어서...? 아니면 간단해서...?
기억이 잘 나지 않지만 암턴 파이썬을 이용하는 방식을 택했다.
그래서 멘토님이랑 같이(라고 쓰고 멘토님이 혼자,,) 멘토링 시간 동안 코드를 짰다.
그 때 참고했던 블로그들!
https://karl27.tistory.com/105
https://stackoverflow.com/questions/15321431/how-to-pass-a-list-from-python-by-jinja2-to-javascript
How to pass a list from Python, by Jinja2 to JavaScript
Let's say I have a Python variable: list_of_items = ['1','2','3','4','5'] and I pass it to Jinja by rendering HTML, and I also have a function in JavaScript called somefunction(variable). I am tr...
stackoverflow.com
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event
https://karismamun.tistory.com/66
Javascript - JQuery를 이용해서 Input 값 변경 실시간 감지
Input 타입에는 여러 가지가 있습니다. select, checkbox, text, password 등 수 많은 타입을 내장하고 있는데, select나 checkbox 같은 경우에는 값의 변경을 단순히 onchange로도 확인할 수 있습니다. 다만, t..
karismamun.tistory.com
그래서 15분만에 json 파일을 읽어와서 javascript로 넘겨줄 수 있었고 ~
자동완성 리스트를 손쉽게 완성할 수 있었다!
1. 파이썬 코드
@app.route('/')
def home():
with open('response_1645513518181.json', 'r', encoding='UTF-8') as f:
json_data = json.load(f)
airport_iata = []
for e in json_data['data']:
airport_iata.append(e['IATA코드'])
return render_template('index.html',data=json.dumps(airport_iata))
2. javascript 코드
//JSON file로 만든 리스트를 읽어와서, 변수로 만들어준다.
var iata_list = {{ data|safe }}
//autocomplete function으로 적용해준다.
autocomplete(document.getElementById("airport"), iata_list)
여기서 끝내면 아쉬우니까 ㅎ_ㅎ 멘토링 이후로 몇 가지를 더 추가해서 완성을 했다.
공항의 IATA code, ICAO code, 한글명 모두를 자동완성 가능하게 만들기!
이 때, 다 섞여서 자동완성이 들어가면 넘 복잡스러우니까,
dropdown을 이용하여 먼저 IATA/ ICAO/ 한글명 중 선택을 하게 한 다음,
해당되는 리스트에서만 검색하도록 기능을 구현했다.
구현한 순서는
1. 리스트 구분해서 쏴주기 - 코드 쫌만 바꾸면 됐음, 매우 간단
2. dropdown 박스 만들기 - 검색하면 바로 나옴. 아래는 제일 도움을 받았던 블로그
https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_optgroup
W3Schools online HTML editor
The W3Schools online code editor allows you to edit code and view the result in your browser
www.w3schools.com
3. dropdown 박스에서 select한 값에 따라, autocomplete가 적용되는 리스트를 바꿔주기
보통의 dropdown 박스는 그냥 select만 되고, 적용을 하려면 submit 버튼을 별도로 눌러줘야 하는 형태였다.
하지만 나는 submit 버튼 만들기 싫었고... 검색을 해봤다 (select dropdown list without sumbit 뭐 이렇게ㅋㅋㅋ)
결과적으로 dropdown option들 밑에 submit 버튼을 따로 만들지 않고, select ID에다가 onchange 함수를 덧붙여주면 되는 거였다!
아래는 참고했던 사이트 :)
How to submit value in <select><option> without submit button.
This is my code: <form action="?sort=SELECTEDVALUEHERE" method="GET"> <select> <option value="1">Option 1 </option> <option value="2">Option 2 </option>...
stackoverflow.com
<form action="#">
<select name="searchType" id="searchType" onchange="select_search_type()">
<option selected>Select Search Type</option>
<option value="IATAcode">IATA</option>
<option value="ICAOcode">ICAO</option>
<option value="airportName">Full name</option>
</select>
</form>
아래는 dropdown에서 선택해서, onchange가 되면 가동되는 select_search_type() 함수.
function select_search_type() {
let searchType = $('#searchType').val()
if (searchType == "IATAcode") {
autocomplete(document.getElementById("airport"), iata_list);
} else if (searchType == "ICAOcode") {
autocomplete(document.getElementById("airport"), icao_list);
} else {
autocomplete(document.getElementById("airport"), name_list);
}
}
4. 그 다음, DB에서 공항 정보를 search하는 코드에 추가를 해줬다
코드의 글자수가 다르니 그것을 기준으로!
if (len(airport_receive)) == 4:
airport_info = db.airports.find_one({'icaoCode': airport_receive}, {'_id': False})
elif (len(airport_receive)) == 3:
airport_info = db.airports.find_one({'iataCode': airport_receive}, {'_id': False})
else:
airport_info = db.airports.find_one({'name_KR': airport_receive}, {'_id': False})
5. 추가로는, 검색 후 검색창과 검색 옵션이 초기화되는 기능도 소소하게 추가를 해줬다.
ID값으로 구분해서 없애주는거에서 아아아아주 살짝 헤맸는데 검색하니 바로 나옴...
//input값 지워주기
$('#airport').val('')
//select 초기화하기
$('#searchType').prop('selectedIndex',0)
결과
하... 너무 만족스럽다 ^^
이제 배포도 해봐야지~~~~~~~
'Development > Web development' 카테고리의 다른 글
웹개발 프로젝트 : (5) 웹페이지 1차 업그레이드 (0) | 2022.03.07 |
---|---|
웹개발 프로젝트 : (4) 웹페이지 1차 완성 (0) | 2022.02.23 |
웹개발 프로젝트 : (3) 지도 위치 바꾸기 (0) | 2022.02.22 |
웹개발 프로젝트 : (2) 지도 넣기 (0) | 2022.02.21 |
웹개발 프로젝트 : (1) 기획안 (0) | 2022.02.14 |