django-фильтр не соответствует - PullRequest
0 голосов
/ 11 марта 2019

Я не могу найти это в документации, поэтому я спрашиваю здесь. Я создал фильтр с django-filter , и он работает правильно, но если кто-то выберет фильтры, которых нет ни у одного объекта, тогда пользователь получит пустую страницу. Я хотел бы добавить простой пункт

Ни один критерий не соответствует

если фильтруемый объект не существует.

Я пробовал с шаблонными тегами типа

{% if obj в filter.qs! = None%} {% endif%}

Но это не работает. Кто-нибудь знает, как это сделать?

filters.py

import django_filters
from .models import Company, COMPANY_TECHNOLOGIES
from django_filters import ChoiceFilter

class CompanyFilter(django_filters.FilterSet):

class Meta:
    model = Company
    fields = ['type', 'city', 'students']

def __init__(self, *args, **kwargs):
    super(CompanyFilter, self).__init__(*args, **kwargs)
    self.filters['type'].extra.update(
        {'empty_label': 'All'})
    self.filters['city'].extra.update(
        {'empty_label': 'All'})
    self.filters['students'].extra.update(
        {'empty_label': 'All'})

comp_list.html

{% extends 'company/base.html' %}
{% block content %}

<div id="filter">
<form action="" method="get" id="submit">
    {{ filter.form.as_p }}
    <input type="submit"/>
</form>
{% for obj in filter.qs %}
<a href="/brands/{{obj.id}}">{{ obj.name }}</a>
    <p>Image {% if obj.image != None %}
    <img src="{{ obj.image.url }}">
    {% endif%}</p>
    <p>Icon {% if obj.icon != None %}
    <img src="{{ obj.icon.url }}" width="30" height="30">
    {% endif%}</p>

    <br> Type: {{  obj.type }} City: {{ obj.city }} Stack: {{  obj.stack }} 

{% if obj not in filter.qs %}
    <p>no matches</p>
{% endif %}
{% endfor %}

{% endblock %}
</div>

views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from .models import Company
from .filters import CompanyFilter
from rest_framework import viewsets
from .serializers import CompanySerializer
# Create your views here.

def comp_list(request):
    f = CompanyFilter(request.GET, queryset=Company.objects.all())
    return render(request, 'company/comp_list.html', {'filter': f})

##def brands(request, slug):
##brands = Company.objects.all()
##return render(request, 'company/comp_view.html', {'brands': brands})

def brands(request, pk):
    brand = get_object_or_404(Company, pk=pk)
    return render(request, 'company/comp_view.html', {'brand': brand})

#rest api


class CompanyViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Company.objects.all()
    serializer_class = CompanySerializer

1 Ответ

0 голосов
/ 11 марта 2019

Извините, что потратил ваше время, я должен сразу перейти к документации django и использовать встроенный шаблонный тег

{% empty %}

Я только что добавил это в свой comp_list.html, как показано ниже

{% extends 'company/base.html' %}
{% block content %}

<div id="filter">
<form action="" method="get" id="submit">
    {{ filter.form.as_p }}
    <input type="submit"/>
</form>
{% for obj in filter.qs %}
{% if obj in filter.qs %}
<a href="/brands/{{obj.id}}">{{ obj.name }}</a>
    <p>Image {% if obj.image != None %}
    <img src="{{ obj.image.url }}">
    {% endif%}</p>
    <p>Icon {% if obj.icon != None %}
    <img src="{{ obj.icon.url }}" width="30" height="30">
    {% endif%}</p>

    <br> Type: {{  obj.type }} City: {{ obj.city }} Stack: {{  obj.stack }} 
{% endif %}
{% empty %}
    <p>no matches</p>
{% endfor %}

{% endblock %}</div>

И теперь все работает как надо, если пользователь попытается отфильтровать объект по критериям, которые не совпадают, он получит ответ в виде абзаца <p> No Matches </p>

...