Filtrowanie elementów w ListView po dacie

0

OK, po kolei:

Model:

class MyModel(models.Model):
  date = models.DateField(default=now)
  minutes = models.PositiveSmallIntegerField()
  notes = models.CharField()

urls:

urlpatterns = [
  path('', AllRowsView.as_view(), name='all_rows_view'),
  path('<int:month>/<int:year>/', MonthView.as_view(), name='month_view'),
]

views:

class AllRowsView(ListView):
    template_name = 'templates/all.html'
    context_object_name = 'all_rows'
    model = MyModel


class MonthView(ListView)
    template_name = 'templates/month.html'
    context_object_name = 'month_rows'
    model = MyModel

Chciałbym żeby ten widok MontView wyświetlał tylko dane z konkretnego miesiąca, czyli jeśli url będzie

apka/12/2022/

to chciałbym żeby widok wyświetlił wyniki zapytania:

MyModel.objects.filter(date__month='12').filter(date__year='2022')

Wiem, że w klasie MonthView powinienem nadpisać metodę get_queryset, na coś w stylu:

def get_queryset(self, **kwargs):
  qset = super().get_queryset(**kwargs)
  return qset.filter(date__month = ???).filter(date__year = ???)

Ale jak przekazać miesiąc i rok z urla do tych filrtów?

Pytanie może banalne, ale dla mnie Django to spora nowość, kopię się z tym od kilku dni i póki co nie wpadłem na to jak to ugryźć.

0
szczur3k napisał(a):

Ale jak przekazać miesiąc i rok z urla do tych filrtów?

Pytanie może banalne, ale dla mnie Django to spora nowość, kopię się z tym od kilku dni i póki co nie wpadłem na to jak to ugryźć.

A próbowałes wpisać w google "django filter by month and year"?

0

Tak, jest mnóstwo odpowiedzi jak to filtrować z podanymi na sztywno danymi, ale póki co nic nie znalazłem na temat przekazywania parametrów z URL-a do get_queryset.

0
szczur3k napisał(a):

Tak, jest mnóstwo odpowiedzi jak to filtrować z podanymi na sztywno danymi, ale póki co nic nie znalazłem na temat przekazywania parametrów z URL-a do get_queryset.

No to pokaż co znalzłeś.

0

Hm, nie do końca rozumiem, co mam wkleić? Jest sporo wyników w stylu:

ndays = 5
start_date = timezone.now()
end_date = start_date + timedelta(ndays)
contract_list = Contract.objects.filter(date_contract__range=[start_date, end_date])

Lub takich gdzie są przykłady querysetów Model.objects.filter(datę__year=2023), czyli są albo dane przypisane na sztywno, ale są wynikiem jakiś działań w obrębie widoku, ale nigdzie nie widzę tego, co potrzebuję ja - czyli pobrania danych z urla i użycie w widoku.

No, chyba że coś nie tak szukam?

1
szczur3k napisał(a):

Hm, nie do końca rozumiem, co mam wkleić? Jest sporo wyników w stylu:

ndays = 5
start_date = timezone.now()
end_date = start_date + timedelta(ndays)
contract_list = Contract.objects.filter(date_contract__range=[start_date, end_date])

Lub takich gdzie są przykłady querysetów Model.objects.filter(datę__year=2023), czyli są albo dane przypisane na sztywno, ale są wynikiem jakiś działań w obrębie widoku, ale nigdzie nie widzę tego, co potrzebuję ja - czyli pobrania danych z urla i użycie w widoku.

No, chyba że coś nie tak szukam?

No próbujesz zrobić trzy rzeczy na raz:

  1. Parsowanie danych z URL to jedno
  2. Użycie Djangowego View to drugie
  3. Customowe filtrowanie modeli to trzecie

Nie sądzę że jest jakiś sposób out-of-the-box żeby to zrobić za jednym zamachem, więc ja bym na Twoim miejscu zrobił te trzy rzeczy osobno, i potem ewentualnie próbował je jakoś uwspólnić.

0

W sumie prawda. Oki, będę kombinował. Dzięki za pomoc :)

0

Ale jak przekazać miesiąc i rok z urla do tych filrtów?

https://docs.djangoproject.com/en/4.1/topics/http/urls/

1

Spróbuj tak:

def get_queryset(self, *args, **kwargs):
    month = kwargs.get('month')
    year = kwargs.get('year')
    qs = MyModel.objects.filter(date__month = month).filter(date__year = year)
    return qs

1 użytkowników online, w tym zalogowanych: 0, gości: 1