Django 连接处的多值错误/

Django 连接处的多值错误/,django,django-views,Django,Django Views,我正在尝试将所有位置功能放在一个页面上,例如 获取用户位置,将其发布到数据库,然后根据用户输入的公里半径值过滤结果 我在/connect/'latitude'处收到了多值DictKeyError,因为POST请求将 location = Location(latitude=request.POST['latitude'], longitude=request.POST['longitude'], user = request.user) 应该什么时候开始 if request.POST['ra

我正在尝试将所有位置功能放在一个页面上,例如
获取用户位置
将其发布到数据库
,然后
根据用户输入的公里半径值过滤结果

我在/connect/'latitude'处收到了
多值DictKeyError,因为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']:
将POST请求定向到正确的函数

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

我错过什么了吗

views.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'})
home.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>

var-pos;
var$demo;
函数getLocation(){
if(导航器.地理位置){
navigator.geolocation.getCurrentPosition(showPosition);
}否则{
$demo.text(“此浏览器不支持地理位置”);
}
}
功能显示位置(位置){
pos=位置;
var{纬度,经度}=位置坐标;
$('btn_submit').attr(“禁用”,空);
}
$(文档).ready(函数(){
$demo=$(“#demo”);
$('btn_submit')。在('click',function()上{
var数据=位置坐标;
data.csrfmiddlewaretoken=$('input[name=csrfmiddlewaretoken')).val();
$.post(“”,数据,函数(){
警报(“位置已确认!”);
});
});
});
与人交往。

1.查找位置 2.提交位置 {{filter.form} 搜索。 {%csrf_令牌%}
请求。POST
只是一个python字典(几乎,同一个键可以有多个值,因此类名为
多值dict
)。因此,只需将其视为普通字典对象:

  • dict[key]
    如果
    键不存在,则会引发
    KeyError
  • dict.get(key)
    返回
    key
    None
    的值(如果不存在)
  • dict.get(key,default)
    如果
    不存在,则返回
    default的
    的值
request.POST['latitude']
request.POST['longide']
request.POST['radius']
如果这些键不在POST参数中,将引发此异常。检查提交的内容时,始终使用
request.POST.get(参数名称)


在您的情况下,您还应该在request.POST中添加
if'latitude',在request.POST中添加'longitude'。POST
子句,然后再使用
latitude
longitude
请求执行任何操作。POST
只是一个python字典(几乎,同一个键可以有多个值,因此类名为
MultiValueDict
)。因此,只需将其视为普通字典对象即可:

  • dict[key]
    如果
    键不存在,则会引发
    KeyError
  • dict.get(key)
    返回
    key
    None
    的值(如果不存在)
  • dict.get(key,default)
    如果
    不存在,则返回
    default的
    的值
request.POST['latitude']
request.POST['longitude']
request.POST['radius']
如果这些键不在POST参数中,将引发此异常。在检查提交的内容时始终使用
request.POST.get(参数名称)


在您的情况下,您还应该在request.POST中添加
if'latitude',在request.POST中添加'longitude'
,您可能没有使用post方法传递它。而您的
if..
条件在该条件之后。因此Django会给您错误,因为它找不到任何具有此名称的参数,并将停止进一步的执行

因此,在post请求中,如果您未传递经纬度参数,请尝试将其写入:

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

或者


在访问
latitude
longituted
参数之前,请输入
if..
条件。

在post方法中,您已添加
请求。post['latitude']
,您可能没有使用post方法传递它。而您的
if..
条件在该条件之后。因此Django会给您错误,因为它找不到任何具有此名称的参数,并将停止进一步的执行

因此,在post请求中,如果您未传递经纬度参数,请尝试将其写入:

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

或者


在访问
latitude
longitutte
参数之前,请先输入
if..
条件。

什么是“应该将要…”您的代码逐行执行,如果第一行抛出异常,它不会跳过它…您的意思是“应该将要…”。您的代码逐行执行,如果第一行抛出异常,它将不会跳过它…感谢您的回复。
请求。POST['lation/longitude']当用户首先按下
btn submit
时,
被传递到
location
变量。然后
lat lon
应该在
radius
queryset中使用。我之前已经交换了
if…
条件,但我仍然得到错误。简而言之,我正在尝试处理来自post请求的不同值。T感谢您的回复。当用户按下
btn submit
firs时,
request.POST['lation/longitude']
将传递到
location
变量