python - 如何编写 Django 'if then else' 语句逻辑
问题描述
我有一个当前运行 forloop 以显示所有用户的主页。
{% for user in users %}
在同一页面上,有一个表单可供过滤radius (km)
以查看您附近的用户。
目前,您提交半径过滤用户后,没有返回任何内容,因为没有
{% for user in location %}
forloop 呢。
我知道我需要一些
{% if xxx %} {% else %} {% endif %}
声明,但我不确定如何编写它们。
本质上,如果没有选择过滤器/提交半径,我想返回所有用户(就像现在一样)。但是如果提交了半径或应用了过滤器,我希望页面返回查询集/多个查询集的结果。
非常感谢和任何关于清理我的代码的建议,因为我是一个初学者。
视图.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)
网址.py
urlpatterns = [
path('', connect_views.ConnectView.as_view(), name='connect_home'),
path('location', connect_views.location, name='location'),
连接.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 %}
解决方案
您不需要两个 for 循环。您所拥有的唯一错误是您的location
视图将其用户查询集发送为location
而不是users
. 更改它(注意,没有理由使用该dict()
功能):
context = {'users': queryset}
return render(request, 'connect/home.html', context)
推荐阅读
- r - R中的randomForest包如何解释字符变量
- python - Cast 在电视中的工作原理(在接收者端)
- c# - 如何将特定属性添加到字体?
- c# - ASP.NET Core Web API POST 请求适用于 Postman,但不适用于 C#/React
- android - 当我使用 ArrayAdapter 时,是什么导致了 android.content.res.Resources$NotFoundException?
- reactjs - 我可以在反应钩子中使用“this”吗?
- reactjs - 将用于 ML 的烧瓶集成到 meteor.js 应用程序中
- javascript - 如何动态调用客户端交互发起的servlet以在div(不是iframe)中显示html而不触发页面重新加载
- python - __init__ 方法中的“self”对象来自哪里?
- r - 为什么第二个 ifelse 没有在 R 中评估,为什么 if else 没有矢量化?