I created a map using Folium in Python to visualize some geospatial data. However, I want to add a search bar with a drop-down list of cities that I want to manually write. This search bar should allow users to search for a specific city and, upon selection, the map should automatically pan to that city's location. How can I achieve this functionality using Folium?
**index.html**
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<title>HomePage</title>
</head>
<body>
<!--- NAVBAR -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Map App</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="{% url 'index' %}">Map <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
</ul>
<form class="form-inline my-2 my-lg-0" method="post">
{% csrf_token %}
{{form}}
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
<!---END NAVBAR-->
<div class="container">
<div class="row mt-5">
<div class="col-md-12 offset-md-0">
{{m | safe }}
</div>
</div>
</div>
<!-- Optional JavaScript; choose one of the two! -->
<!-- Option 1: jQuery and Bootstrap Bundle (includes Popper) -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" crossorigin="anonymous"></script>
<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js" integrity="sha384-+sLIOodYLS7CIrQpBjl+C7nPvqq+FbNUBDunl/OZv93DB7Ln/533i8e/mZXLi/P+" crossorigin="anonymous"></script>
-->
</body>
</html>
**views.py**
from .forms import SearchForm
import win32api
from django.contrib import messages
# Create your views here.
def index(request):
if request.method == "POST":
form = SearchForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
else:
form = SearchForm()
address = Search.objects.all().last()
location = geocoder.osm(address)
lat = location.lat
lng = location.lng
country = location.country
if lat == None or lng == None:
address.delete()
return HttpResponse('You address input is invalid')
m = folium.Map(location=[12.7000, 122.9833], zoom_start=6, min_zoom = 6)
folium.Marker([lat, lng], tooltip ="Click for more", popup=country).add_to(m)
m = m._repr_html_()
context = {
'm': m,
'form': form,
}
return render(request, 'index.html', context)
**forms.py**
from django import forms
from .models import Search
class SearchForm(forms.ModelForm):
class Meta:
model = Search
fields = ['address', ]
**models.py**
from django.db import models
# Create your models here.
class Search(models.Model):
address = models.CharField(max_length=200, null=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.address