Если фильтр не был применен, на странице должны отображаться все пользователи, возможно
{% 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})