У меня есть ситуация, когда мне сначала нужно отобразить форму для пользователя, когда пользователь заполняет два поля, а после этого на основе полей формы я запрашиваю базу данных и показываю пользователю список объектов. Но проблема в том, что я использую представления на основе классов, и я не могу получить доступ к очищенным данным в моем методе get. Я знаю, что формы должны обрабатываться в методах post, а не в методах get, поэтому я не могу обработать форму в своем методе get. Вот мой код:
views.py
class IncomeTransactionReport(LoginRequiredMixin, ListView):
def post(self, request, *args, **kwargs):
# here I get form from post request
form = IncomeReportForm(request.POST)
# if form is valid redirect user to the same page to show the results based on the filled
# in form fields 'from_date' and 'to_date'
if form.is_valid():
from_date = form.cleaned_data['from_date']
to_date = form.cleaned_data['to_date']
return redirect('income_report')
# else render the same page with the form and form errors
else:
error_message = 'Please solve the error and try again'
return render(request, 'report_income.html', context={'error_message': error_message,
'form': form}, status=422)
def get(self, request, *args, **kwargs):
# here I need to access 'from_date' and 'to_date' to query the database and show the results
# in paginated pages to the user
if from_date != None and to_date != None:
incomes = Income.objects.filter(user=user,
date__gte=datetime.date.fromisoformat(from_date),
date__lte=datetime.date.fromisoformat(to_date)).all()
elif from_date != None:
incomes = Income.objects.filter(user=user,
date__gte=datetime.date.fromisoformat(from_date),
date__lte=datetime.date.fromisoformat(from_date) + \
relativedelta.relativedelta(months=+1)).all()
else:
incomes = Income.objects.filter(user=user).all()
page = request.POST.get('page', 1)
paginator = Paginator(incomes, 5)
try:
incomes = paginator.page(page)
except PageNotAnInteger:
incomes = paginator.page(1)
except EmptyPage:
incomes = paginator.page(paginator.num_pages)
message = 'This is your requested list of incomes'
# here I return the results
return render(request, 'report_income.html', {'message': message, 'incomes': incomes})
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, чтобы опубликовать ее здесь.