Я пытаюсь закодировать сайт, который позволяет пользователям искать лекарство и возвращать список аптек поблизости, в которых есть искомая на складе. У меня есть большая часть работы, кроме сортировки результатов по местоположению от пользователя.
Я выяснил, как получить местоположение пользователя из JS, но я не знаю, как передать это обратно в набор запросов. В настоящее время я установил его так, чтобы скрипт запускался на домашней странице только при аутентификации, поскольку я заставляю людей входить в систему, чтобы использовать сайт (в качестве меры безопасности). Я пробовал искать примеры, но действительно только придумал GeoIP
Вот соответствующий код:
home.html
<form>
<div class="input-group px-3">
<input id="searchtxt" type="text" class="form-control" name="q" placeholder="Search for a medicine..." value="{{ request.GET.q }}">
<div class="input-group-append">
<button id='searchbtn' class="btn btn-warning btn-outline-dark" type="submit">Search</button>
</div>
</div>
</form>
Under this I run through the resulting query_set object (locations) using the django template.
views.py
class StockListView(LoginRequiredMixin, ListView):
model = Stock
template_name = 'searcher/home.html'
context_object_name = 'locations'
def get_queryset(self):
if self.request.GET.get('q'):
drug_name = self.request.GET.get('q').split(' ')[0]
queryset = Stock.objects.filter(Q(drug__nzulm__startswith=drug_name) & Q(stock__gt=0)).annotate(distance=Distance('pharmacy__location', location)).order_by('-distance', 'stock')
# this is the point where I'm stuck, I'm not sure how to set "location" in the Distance().
if queryset:
return queryset
else:
messages.error(self.request, f'Sorry, no results for "{drug_name}".') # using Bootstrap messaging framework
И модели, которые он ищет:
class Stock(models.Model):
drug = models.ForeignKey(Medicine, on_delete=models.CASCADE)
pharmacy = models.ForeignKey(Pharmacy, on_delete=models.CASCADE)
stock = models.IntegerField()
class Medicine(models.Model):
nzulm = models.CharField(max_length=100)
trade = models.CharField(max_length=100)
strength = models.CharField(max_length=200, blank=True)
formulation = models.CharField(max_length=50)
class Pharmacy(models.Model):
owner = models.ForeignKey(User, on_delete=models.PROTECT)
name = models.CharField(max_length=100)
location = GIS.PointField()
address = models.CharField(max_length=100, blank=True)
suburb = models.CharField(max_length=100, blank=True)
city = models.CharField(max_length=100, blank=True)
Наконец, вот код, который я запускаю, чтобы определить местоположение пользователя в JS. В настоящее время это только вход в консоль только потому, что я не знаю, как передать его обратно.
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
console.log("Geolocation is not supported by this browser.");
}
}
function showPosition(position) {
console.log("Latitude: " + position.coords.latitude +
" Longitude: " + position.coords.longitude);
}
window.onload = getLocation();
Когда пользователь ищет лекарство, я хочу каким-то образом включить его в качестве объекта Point () в набор запросов, чтобы набор запросов можно было сначала упорядочить по кратчайшему расстоянию.
Кто-нибудь может указать мне правильное направление? Кажется, мне нужно включить сюда AJAX, но я не совсем уверен, как добавить его в метод GET. Любая помощь будет принята с благодарностью!