Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 18, 2014 19:36:37

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

CBV + form

Делаю попытки сделать страничку с формой на 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)

Офлайн

#2 Окт. 18, 2014 21:02:30

N..E.M
Зарегистрирован: 2014-10-15
Сообщения: 7
Репутация: +  1  -
Профиль   Отправить e-mail  

CBV + form

даже страшно предположить, какие могут ошибки посыпаться А чем продиктовано столь мудрёное решение? Почему не сделать простым способом? То есть, CreateView, который будет сам показывать форму и сохранять данные в модель, но у которого в get_context_data будут выбираться записи из нужной модели?

Офлайн

#3 Окт. 19, 2014 04:55:28

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

CBV + form

Мне не нужно создание, мне нужно показать данные с определенным выбором данных.
То есть, а то я уже сам запутываюсь.
- при переходе по урл должна отображаться форма в которой нужно ввести даты
- после отправки отображается список с выборкой по датам и все та же форма
Сейчас я так думаю он мне пишет что у меня поля формы не правильно заполнены при переходе на урл.

Офлайн

#4 Окт. 19, 2014 09:28:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

CBV + form

(OperationsList, FormView, ListView)
Не стоит так делать, если есть желание смешивать разные дженерики, то подмешивайте миксины, а не классы представлений. https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-editing/#formmixin



Офлайн

#5 Окт. 19, 2014 10:58:25

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

CBV + form

По миксинам мало инфы на русском А мой английский безногий
Я тут понаделал, теперь у меня хотябы форма и список отображается, но при отправке формы вылазит 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 я что-то догнать не могу.

Офлайн

#6 Окт. 21, 2014 11:45:02

balalay12
Зарегистрирован: 2014-07-28
Сообщения: 92
Репутация: +  4  -
Профиль   Адрес электронной почты  

CBV + form

Переделал вот так:

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))
Вроде работает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version