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
变量