如何编写Django'if then else'语句逻辑

时间:2019-02-13 16:03:22

标签: python django django-templates

我有一个主页,当前运行一个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 %}

1 个答案:

答案 0 :(得分:1)

您不需要两个for循环。您所拥有的唯一问题是您的location视图将其用户查询集发送为location而不是users。对此进行更改(请注意,没有理由使用dict()函数):

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