Как изменить даты при фильтрации набора запросов в Django?

Я хочу вывести список всех платежей, совершенных компанией. Но я хочу иметь возможность фильтровать даты, показывая только платежи, например:

  • За последние 30 дней
  • За последние 90 дней
  • Между двумя определенными датами

Теперь я знаю, что могу фильтровать в моих представлениях между двумя датами, или, например, до сегодняшнего дня. Но как я могу сделать это, используя что-то вроде выпадающего списка или выбора данных в шаблоне?

someting like this

Что-то вроде этого для справки.

Для справки, модель выплат будет выглядеть следующим образом:

class Payment(models.Model):
    name = models.CharField(max_length=250)
    date = models.DateField(default=datetime.now)
    value = models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(0.00)])

Используйте django формы с полем выбора и на основе значения фильтруйте ваш набор запросов. например:

Выборы:

PERIOD_LAST_THREE_MONTHS = "last-three-months"
PERIOD_LAST_SIX_MONTHS = "last-six-months" # ..

PERIOD_CHOICES = (
    (PERIOD_LAST_THREE_MONTHS, _("Last 3 Months")),
    (PERIOD_LAST_SIX_MONTHS, _("Last 6 Months")), ..
)

ПРИМЕЧАНИЕ: переменные разделены дефисами, так как они будут использоваться в строке запроса http.

Utils:

def get_period_date(period):
    if period == PERIOD_LAST_THREE_MONTHS:
        return timezone.now() - timezone.timedelta(days=90)
    elif period == PERIOD_LAST_SIX_MONTHS:
        return timezone.now() - timezone.timedelta(days=180)

Эта функция возвращает объект datetime для фильтрации вашего набора запросов.

Формы:

class DateForm(forms.Form):
    period = forms.ChoiceField(choices=PERIOD_CHOICES, required=False)

Вид:

class PaymentFormView(base.TempleView):
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['payments'] = Payment.objects.filter(date__gte=get_period_date(self.request.GET('period'))
        return context

По сути, на основе значения формы мы получаем объект дата-время и фильтруем набор запросов (помните, что у вас есть объект date). Я использовал представление шаблона вместо представления формы, потому что я предполагаю, что вы не хотите принимать пост-запрос. Но опять же, вы можете использовать представление формы и не разрешать методы post, это зависит от вас (Это также можно сделать с помощью представлений, основанных на функциях). Также учитывайте возможность того, что форма может быть пустой, поэтому строка запроса в http запросе может не содержать аргумента period, что может привести к ошибке, и решайте эту ситуацию как вам угодно.

Вернуться на верх