Как в Django использовать CBV с формой?

Здравствуйте! У меня есть код:
class OperationsList(object):
    model = Many
    earn = False
    cost = False
    title = ''
    summa = {}
    form = ''

    def get_queryset(self):
        qs = Many.objects.filter(users=self.request.user.id).order_by('-date')
        return qs

    def get_context_data(self, **kwargs):
        context = super(OperationsList, self).get_context_data(**kwargs)
        context['user_username'] = self.request.user.username
        context['e'] = self.earn
        context['c'] = self.cost
        context['title'] = self.title
        if self.form:
            context['form'] = self.form
        if self.summa['sum__sum'] is None:
            context['summa'] = 0
        else:
            context['summa'] = self.summa['sum__sum']
        return context

class EarnPeriods(OperationsList, FormMixin, ListView):
    form_class = forms.DateForm
    form = forms.DateForm
    template_name = 'period.html'
    context_object_name = 'earnings_list'
    earn = True
    now_date = datetime.date.today()
    date_start = now_date
    date_end = now_date

    def form_valid(self, form):
        self.date_start = form.clean['date_start']
        self.date_end = form.clean['date_end']
        return super(EarnPeriods, self).form_valid(form)

    def get_queryset(self):
        print(self.date_start)
        print(self.date_end)
        self.summa = super(EarnPeriods, self).get_queryset().filter(date__range=(self.date_start, self.date_end), sum__gt=0).aggregate(Sum('sum'))
        return super(EarnPeriods, self).get_queryset().filter(date__range=(self.date_start, self.date_end), sum__gt=0)

Я недавно изучаю Django и учил по книге в которой про CBV нет ни строчки, поэтому у меня сейчас по мере переписывания кода на CBV возникают вопросы и непонятности.
Вопрос:
Я хочу сделать, чтобы при переходе по URL у меня была форма, а после отправки данных отображалась форма и список под ней. Но я не знаю как это сделать и все что смог добиться, это что при переходе по URL появляется форма и список под ней, но при отправке выдает 405 ошибку. Скажите пожалуйста как сделать это правильно.
  • Вопрос задан
  • 2515 просмотров
Решения вопроса 1
Vintorez
@Vintorez
Вы в классе EarnPeriods используете наследование от класса ListView, который не поддерживает post-запросы https://docs.djangoproject.com/en/dev/ref/class-ba...
Этот класс используется только для отображения "списка объектов".
А форму на html-странице Вы отправляете post-запросом. Вот и ошибка 405 получается.

В общем, у Вас 3 варианта:
1) использовать класс, поддерживающий post-запросы. Какой-нибудь из этих https://docs.djangoproject.com/en/dev/ref/class-ba... в зависимости от того, что нужно;
2) отправлять форму в шаблоне get-запросом (только если эта форма получает и отображает объекты, а не изменяет их в БД);
3) написать самому нужные методы (в том числе и post()), но тогда лучше наследоваться от какого-нибудь общего класса типа https://docs.djangoproject.com/en/dev/ref/class-ba...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
vvpoloskin
@vvpoloskin
Инженер связи
405 - ошибка неверного метода. Может быть надо попробовать добавить руками метод post во вьюху и посмотреть, доходит ли до него? и явно указать action для формы?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы