Как отобразить ваши запросы с помощью фильтра?

#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. Я думаю, что проглем связан с набором запросов для пагинатора, он должен быть после фильтра. См.раздел правка.