首页 > 解决方案 > /connect/ 处的 MultiValueDictKeyError

问题描述

我试图在一个页面上拥有所有位置功能,例如 get users location, post it to the database,然后filter results基于用户输入的公里半径值。

我得到MultiValueDictKeyError at /connect/ 'latitude'是因为 POST 请求将

location = Location(latitude=request.POST['latitude'], longitude=request.POST['longitude'], user = request.user)

什么时候应该去

if request.POST['radius']:
            radius_km = request.POST.get('radius', 0)

我研究了如何阻止这种情况发生,并发现我可以if request.POST['radius']:将发布请求定向到正确的功能。

不幸的是,这对错误没有帮助。

我错过了什么吗?

视图.py

class ConnectView(View):
    template_name = 'connect/home.html'
    def get(self, request, *args, **kwargs):
        f = ProfileFilter(request.GET, queryset=Profile.objects.exclude(user=request.user))
        context = {
            'users': User.objects.exclude(username=request.user),
            'friends': Friend.objects.filter(current_user=request.user),
            'filter': f,
        }
        return render(request, self.template_name, context)

    def post(self, request, *args, **kwargs):
        location = Location(latitude=request.POST['latitude'], longitude=request.POST['longitude'], user = request.user)
        location.save()
        if request.POST['radius']:
            radius_km = request.POST.get('radius', 0)
            queryset = User.objects.annotate(
                radius_sqr=pow(models.F('loc__latitude') -
                request.user.loc.latitude, 2) + pow(models.F('loc__longitude') -
                request.user.loc.longitude, 2)
                ).filter(
                radius_sqr__lte=pow(int(radius_km) / 9, 2)
                ).exclude(username=request.user)
            context = {'users': queryset}
        return JsonResponse({'message': 'success'})

主页.html

<script>
  var pos;

  var $demo;

  function getLocation() {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(showPosition);
    } else {
      $demo.text("Geolocation is not supported by this browser.");
    }
  }

  function showPosition(position) {
    pos = position;
    var { latitude, longitude } = pos.coords;
    $('#btn_submit').attr("disabled", null);
  }

  $(document).ready(function() {
    $demo = $("#demo");
    $('#btn_submit').on('click', function() {
      var data = pos.coords;
      data.csrfmiddlewaretoken = $('input[name=csrfmiddlewaretoken]').val();
      $.post('', data, function() {
        alert("Location Confirmed!");
      });
    });
  });

</script>

      <h1>Connect with people.</h1>

            <!-- GET window.location IP Address / lat lon coordinates -->
            <p id="demo"></p>
            <button onclick="getLocation()" class="btn btn-warning" id="confirm">1. Find Location</button>
            <button type="submit" id="btn_submit" name="btn_submit"  class="btn btn-success" disabled>2. Submit Location </button>

            <!-- filter by profile attributes -->
            <form method="GET">
                {{ filter.form }}
                <button type="submit" class="small">Search.</button>
            </form>

            <!-- enter radius to filter by location-->
            <form method="POST">
              {% csrf_token %}
              <input type="number" name="radius">
              <input type="submit" value="filter by kilometers">
            </form>

标签: djangodjango-views

解决方案


在您的 post 方法中,您添加了request.POST['latitude'],您可能不会使用 post 方法传递它。然后你的if..情况就出现了。因此 Django 给你错误,因为它没有找到任何具有此名称的参数,并将停止进一步的执行。

因此,如果您没有传递纬度经度参数,请在发布请求时尝试将其写为:

request.POST.get('latitude', None)

或者,

if..在访问latitudelongitutde参数之前放置您的条件。


推荐阅读