Доступ к form.cleaned_data в методе get в представлениях на основе классов - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть ситуация, когда мне сначала нужно отобразить форму для пользователя, когда пользователь заполняет два поля, а после этого на основе полей формы я запрашиваю базу данных и показываю пользователю список объектов. Но проблема в том, что я использую представления на основе классов, и я не могу получить доступ к очищенным данным в моем методе 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})

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, чтобы опубликовать ее здесь.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Чтобы ответить на ваш вопрос, я просто опишу правильную обработку формы в django. Но ради любви к Богу, пожалуйста, не размещайте такие вопросы, прежде чем читать документацию, которая прекрасно объясняет все здесь Это пример того, как обрабатывать представление, имеющее форму:

SomeClassBasedView(TemplateView):

    template_name = 'some_template.html'

    def get(self, request):
        # some custom get processing
        form = SomeForm()  # inhereting form.Form or models.ModelForm
        context = { 'form': form,
                    # other context
                   }
        return render(request, self.template, context)

    def post(self, request):

        # this works like 'get data from user and populate form'
        form = SomeForm(request.POST)

        if form.is_valid():
            # now cleaned_data is created by is_valid
            # example:
            user_age = form.cleaned_data['age']
            # some other form proccessing
            context = {
                'form': SomeForm(),
                # other context
            }
            return render(request, self.template, context)

        # if there were errors in form
        # we have to display same page with errors
        context = {
            'form': form,
            # other context
        }
        return render(request, self.template, context)
0 голосов
/ 11 апреля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...