django - /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>
解决方案
在您的 post 方法中,您添加了request.POST['latitude']
,您可能不会使用 post 方法传递它。然后你的if..
情况就出现了。因此 Django 给你错误,因为它没有找到任何具有此名称的参数,并将停止进一步的执行。
因此,如果您没有传递纬度经度参数,请在发布请求时尝试将其写为:
request.POST.get('latitude', None)
或者,
if..
在访问latitude
和longitutde
参数之前放置您的条件。
推荐阅读
- asterisk - Asterisk 电话会议适用于 Polycom 电话,但如何使其适用于 microsip 软电话
- google-kubernetes-engine - Apache Beam 管道在 GKE 上失败
- php - 升级 Laravel 5.8 后 ValidationException 错误消息不起作用
- r - R如何总结其他列的列细分百分比
- sql - 如何查找两个数组是否包含sql中的任何常见项目
- angular - 为什么 apollo client:codegen 不生成类型?
- terraform - Terraform 使用“for_each”创建多个网络接口并引用“azurerm_public_ip”
- css - 如何在范围滑块内显示值?
- c# - Linq - 将 1 个查询的结果集与另一个表连接
- linux - bash -c 不设置 $? 正如预期的那样