我有一个主页,当前运行一个forloop来显示所有用户。
{% for user in users %}
在同一页面上,有一种表格可以按radius (km)
进行过滤,以查看您附近的用户。
当前,提交半径以过滤用户后,由于没有
,因此不会返回任何内容 {% for user in location %}
forloop还没有。
我知道我需要一些
{% if xxx %} {% else %} {% endif %}
声明,但我不确定如何写。
基本上,如果未选择任何过滤器/提交了半径,我想返回所有用户(就像现在所做的那样)。但是,如果提交了半径或应用了过滤器,我希望页面返回查询集/多个查询集的结果。
非常感谢,因为我是一个初学者,因此对清理代码的任何建议都会受到赞赏。
views.py
class ConnectView(View):
template_name = 'connect/home.html'
def get(self, request, *args, **kwargs):
context = {
'users': User.objects.exclude(username=request.user),
'friends': Friend.objects.filter(current_user=request.user),
}
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()
return JsonResponse({'message': 'success'})
def location(request):
if request.POST:
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 = dict(location=queryset)
return render(request, 'connect/home.html', context)
urls.py
urlpatterns = [
path('', connect_views.ConnectView.as_view(), name='connect_home'),
path('location', connect_views.location, name='location'),
connect.html
<h1>Connect with people near you.</h1>
<!-- GET window.location IP Address / lat lon coordinates -->
<p id="demo"></p>
<button onclick="getLocation()" class="btn btn-warning" id="confirm">1. Fetch Location</button>
<button type="submit" id="btn_submit" class="btn btn-success" disabled>2. Submit Location </button>
<!-- enter radius to filter by location -->
<form action="location" method="POST">
{% csrf_token %}
<input type="number" name="radius">
<input type="submit" value="filter by kilometers">
</form>
{% for user in users %}
<h4>{{ user.first_name }} {{ user.last_name }}
{{ user.profile.age }} / {{ user.profile.city }}
{{ user.profile.bio }}</h4>
{% endfor %}
答案 0 :(得分:1)
您不需要两个for循环。您所拥有的唯一问题是您的location
视图将其用户查询集发送为location
而不是users
。对此进行更改(请注意,没有理由使用dict()
函数):
context = {'users': queryset}
return render(request, 'connect/home.html', context)