首页 > 解决方案 > 如何编写 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 %}

标签: pythondjangodjango-templates

解决方案


您不需要两个 for 循环。您所拥有的唯一错误是您的location视图将其用户查询集发送为location而不是users. 更改它(注意,没有理由使用该dict()功能):

    context = {'users': queryset}
    return render(request, 'connect/home.html', context)

推荐阅读