Если тогда логика Python возвращает неправильный набор запросов Django - PullRequest
0 голосов
/ 20 февраля 2019

Если фильтр не был применен, на странице должны отображаться все пользователи, возможно

{% for user in users %}

Если отправлено request.POST ProfileFilter и найдены совпадения, страница должнавернуть пользователей в наборе запросов или

{% for profile in filter.qs %}

Если ProfileFilter не возвращает никаких результатов на request.POST, должно отображаться No results found.

С текущей логикой ниже страница возвращает No results, try again? до того, как что-либо опубликовано, что я предполагаю, потому что filter всегда определяется (поэтому {% if profile in filter.qs %} всегда True), поэтому {% for user in users %}никогда не запускается.

Так что можно определить некоторую логику с помощью {% for profile in filter.qs %} для возврата

1) всех пользователей, если набор запросов еще не был опубликован

2) подходящих пользователей, если они были опубликованы

3) no results found если ни один пользователь не соответствует?

Кто-то, пожалуйста, укажите мне правильное направление!Спасибо.

html

{% if filter %}
    {% for profile in filter.qs %}
        <h5>{{ profile.user.first_name }}</h5>
        <p>{{ profile.age }}</p>
    {% empty %}
        <h1>No results, try again?</h1>
    {% endfor %}
{% else %}
    {% for user in users %}
        <h5>{{ user.first_name }}</h5>
        <p>{{ user.profile.age }}</p>
    {% endfor %}
{% endif %}

views.py

class xxx(View):
    template_name = 'xxx'
    def get(self, request, *args, **kwargs):
        filter = ProfileFilter(request.GET, Profile.objects.none())
        context = {
            'users': User.objects.exclude(id=request.user.id),
            'filter': filter,
        }
        return render(request, self.template_name, context)

    def post(self, request, *args, **kwargs):
        users = User.objects.exclude(id=request.user.id)
        queryset = Profile.objects.exclude(user=request.user)
        if 'radius' in request.POST:
            print(request.POST)
            radius_km = request.POST.get('radius', 0)
            queryset = queryset.annotate(
                radius_sqr=pow(models.F('user__loc__latitude') -
                request.user.loc.latitude, 2) + pow(models.F('user__loc__longitude') -
                request.user.loc.longitude, 2)
                ).filter(
                radius_sqr__lte=pow(int(radius_km) / 9, 2)
                )
        filter = ProfileFilter(request.POST, queryset)
        return render(request, self.template_name, {'filter': filter, 'users': users})
...