Есть ли способ включить местоположение пользователя в набор запросов django? - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь закодировать сайт, который позволяет пользователям искать лекарство и возвращать список аптек поблизости, в которых есть искомая на складе. У меня есть большая часть работы, кроме сортировки результатов по местоположению от пользователя.

Я выяснил, как получить местоположение пользователя из 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. Любая помощь будет принята с благодарностью!

...