#django #django-filter
Вопрос:
Поэтому я пытаюсь настроить фильтр для своего веб-сайта, и он не работает; Он не выдает мне ошибку, и URL-адрес обновляется, как при выполнении запроса, но когда я нажимаю «отправить», он по-прежнему отображает все содержимое страницы. Я не могу понять, в чем дело.
filters.py
import django_filters from django_filters import DateFilter from .models import * class UserpostFilter(django_filters.FilterSet): start_date = DateFilter(field_name = "date_published", lookup_expr='gte') end_date = DateFilter(field_name = "date_published", lookup_expr='lte') class Meta: model = Userpost fields = '__all__' exclude = ['image', 'user', 'date_published']
models.py
class Userpost(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) Year = models.CharField(max_length = 4) Mileage = models.CharField(max_length = 8) Make = models.CharField(max_length = 50) Model = models.CharField(max_length = 50) Price = models.DecimalField(max_digits=15, decimal_places=2) email = models.EmailField() date_published = models.DateField(default = timezone.now) image = models.ImageField(null = True, blank = True, upload_to = r"C:UsersgabriDesktoptestecommercestaticimages") def __str__(self): return self.Year " " self.Make " " self.Model @property def imageURL(self): try: url = self.image.url except: url = '' return url
views.py
def posts(request): cars = Userpost.objects.all() p = Paginator(Userpost.objects.all(), 9) page = request.GET.get('page') cars_list = p.get_page(page) nums = "a" * cars_list.paginator.num_pages myFilter = UserpostFilter(request.GET, queryset = cars) cars = myFilter.qs context = {'cars':cars, 'cars_list':cars_list, "nums":nums, "myFilter":myFilter} return render(request, 'store/userposts.html', context)
userposts.html
lt;div class = "row"gt; lt;div class="col"gt; lt;div class = "card card-body"gt; lt;form method="get"gt; {{myFilter.form}} lt;button class="btn btn-primary" type="submit"gt;Searchlt;/buttongt; lt;/formgt; lt;/divgt; lt;/divgt; lt;/divgt; lt;brgt; lt;div class="row"gt; {% for car in cars_list %} lt;div class="col-lg-4"gt; lt;img class="thumbnail" src="{{car.imageURL|default:'/images/transparentLogo.png'}}"gt; lt;div class="box-element product"gt; lt;h6gt;lt;stronggt;{{car.Year}} {{car.Make}} {{car.Model}}lt;/stronggt;lt;/h6gt; lt;hrgt; lt;a class="btn btn-outline-success" href="{% url 'post_detail' car.pk %}"gt;Viewlt;/agt; lt;h4 style="display: inline-block; float: right"gt;lt;stronggt;${{car.Price|floatformat:2}}lt;/stronggt;lt;/h4gt; lt;/divgt; lt;/divgt; {% endfor %} lt;/divgt;
Я был бы очень признателен, если бы вы, ребята, смогли мне помочь
Редактировать
Поэтому я изменил порядок просмотров, чтобы сначала отфильтровать, а затем разбить на страницы, но он по-прежнему делает то же самое. Я не получаю ошибок, но отображаю все содержимое страницы, а не отфильтрованное.
def posts(request): cars = Userpost.objects.all() myFilter = UserpostFilter(request.GET, queryset=cars) cars = myFilter.qs p = Paginator(Userpost.objects.all(), 9) page = request.GET.get('page') cars_list = p.get_page(page) nums = "a" * cars_list.paginator.num_pages context = {'cars':cars, "myFilter":myFilter, 'cars_list':cars_list, "nums":nums} return render(request, 'store/userposts.html', context)
Комментарии:
1. Вы должны сначала отфильтровать, а затем разбить на страницы. Вы разбиваете
myFilter.qs
объект на страницы.2. @WillemVanOnsem Спасибо за ответ, я отредактировал файл и поставил myFilter и myFilter.qs перед пагинатором, но он все равно ничего не сделает. Видите ли вы что-нибудь еще, что это неправильно?
3. вы также должны перечислить через
cars
, так{% for car in cars %}
что , нетcar_list
.
Ответ №1:
Пагинатор должен работать с автомобилями, а не с исходным набором запросов, так как вы просматриваете отфильтрованные результаты
def posts(request): cars = Userpost.objects.all() myFilter = UserpostFilter(request.GET, queryset=cars) if not myFilter.is_valid(): raise ValidationError('filter is invalid') cars = myFilter.qs # This is the change p = Paginator(cars, 9) page = request.GET.get('page') cars_list = p.get_page(page) nums = "a" * cars_list.paginator.num_pages context = {'cars':cars, "myFilter":myFilter, 'cars_list':cars_list, "nums":nums} return render(request, 'store/userposts.html', context)
Комментарии:
1. Я сделал это, и ничего не вышло. Я так растеряна, я действительно не знаю, что не так
2. Я думаю, что проглем связан с набором запросов для пагинатора, он должен быть после фильтра. См.раздел правка.