Найти - Пользователи
Полная версия: CBV + form
Начало » Django » CBV + form
1
balalay12
Делаю попытки сделать страничку с формой на CBV. Проблема в том что после отправки формы должен появляться список (с выборкой по данным из формы) и форма.

Базовый класс:
class OperationsList(object):
    model = Many
    earn = False
    cost = False
    title = ''
    summa = {}
    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.summa['sum__sum'] is None:
            context['summa'] = 0
        else:
            context['summa'] = self.summa['sum__sum']
        return context

Дите. После того как перехожу на урл класса, то он мне отображает ошибку, а не форму.
class EarnPeriods(OperationsList, FormView, ListView):
    form_class = forms.DateForm
    template_name = 'period.html'
    earn = True
    date_start = ''
    date_end = ''
    def form_valid(self, form):
        cd = form.clean()
        self.date_start = cd['date_start']
        self.date_end = cd['date_end']
        return super(EarnPeriods, self).form_valid(form)
    def get_queryset(self):
        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)
N..E.M
даже страшно предположить, какие могут ошибки посыпаться А чем продиктовано столь мудрёное решение? Почему не сделать простым способом? То есть, CreateView, который будет сам показывать форму и сохранять данные в модель, но у которого в get_context_data будут выбираться записи из нужной модели?
balalay12
Мне не нужно создание, мне нужно показать данные с определенным выбором данных.
То есть, а то я уже сам запутываюсь.
- при переходе по урл должна отображаться форма в которой нужно ввести даты
- после отправки отображается список с выборкой по датам и все та же форма
Сейчас я так думаю он мне пишет что у меня поля формы не правильно заполнены при переходе на урл.
FishHook
(OperationsList, FormView, ListView)
Не стоит так делать, если есть желание смешивать разные дженерики, то подмешивайте миксины, а не классы представлений. https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-editing/#formmixin
balalay12
По миксинам мало инфы на русском А мой английский безногий
Я тут понаделал, теперь у меня хотябы форма и список отображается, но при отправке формы вылазит 405 ошибка.
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)
А сути как это должно бывать на CBV я что-то догнать не могу.
balalay12
Переделал вот так:
class EarnPeriods(OperationsList, FormMixin, ListView):
    form_class = forms.DateForm
    form = forms.DateForm
    template_name = 'period.html'
    # context_object_name = 'earnings_list'
    earn = True
    date_start = ''
    date_end = ''
    earnings_list = {}
    def post(self, request):
        form = self.form_class(request.POST)
        if form.is_valid():
            cd = form.clean()
            self.date_start = cd['date_start']
            self.date_end = cd['date_end']
            self.earnings_list = super(EarnPeriods, self).get_queryset().filter(date__range=(self.date_start, self.date_end), sum__gt=0)
            self.summa = super(EarnPeriods, self).get_queryset().filter(date__range=(self.date_start, self.date_end), sum__gt=0).aggregate(Sum('sum'))
            return render_to_response(self.template_name, {'form': form, 'e': True, 'earnings_list': self.earnings_list, 'summa': self.summa['sum__sum']}, context_instance=RequestContext(request))
Вроде работает.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB