Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 16, 2014 08:39:16

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

CBV

Всем привет. Начал осваивать Class Based View и кое что понять не могу.
Написал общий класс для создания:

class Add(CreateView):
    model = Many
    form_class = forms.AddForm
    category_list = {}
    earn = False
    cost = False
    title = ''
    def get_form_kwargs(self):
        kwargs = super(Add, self).get_form_kwargs()
        kwargs['queryset'] = self.category_list
        return kwargs
    def form_valid(self, form):
        instance = form.save()
        instance.users.add(self.request.user.id)
        return super(Add, self).form_valid(form)
    def get_context_data(self, **kwargs):
        context = super(Add, self).get_context_data(**kwargs)
        context['user_username'] = self.request.user.username
        context['e'] = self.earn
        context['c'] = self.cost
        context['title'] = self.title
        return context

наследую от него:
class AddErn(Add):
    template_name = "add.html"
    success_url = "/earnings/"
    category_list = Category.objects.filter(operation_type=1)
    earn = True
    title = u'Ввод доходов'
class AddCost(Add):
    template_name = 'add.html'
    success_url = "/costs/"
    category_list = Category.objects.filter(operation_type=2)
    cost = True
    title = u'Ввод расходов'
    def form_valid(self, form):
        data = form.save(commit=False)
        if data.sum > 0:
            data.sum *= -1
        instance = form.save(commit=True)
        instance.users.add(self.request.user.id)
        return super(AddCost, self).form_valid(form)
У меня возникает чувство что этот код не очень правильный хоть и работает. И еще не могу понять как сделать так чтобы этот базовый класс еще обрабатывал и обновление записи (UpdateView) т.к. код там идентичен.

Офлайн

#2 Окт. 16, 2014 08:53:58

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

CBV

Не нужно привязывать базовый класс к конкретному дженерику, посмотрите как это сделано в джанге - там юзаются миксины (примеси). То есть ваш код будет выглядеть как то так

class Common(object):
    model = Many
    form_class = forms.AddForm
    category_list = {}
    earn = False
    cost = False
    title = ''
    def get_form_kwargs(self):
        kwargs = super(Add, self).get_form_kwargs()
        kwargs['queryset'] = self.category_list
        return kwargs
    def form_valid(self, form):
        instance = form.save()
        instance.users.add(self.request.user.id)
        return super(Add, self).form_valid(form)
    def get_context_data(self, **kwargs):
        context = super(Add, self).get_context_data(**kwargs)
        context['user_username'] = self.request.user.username
        context['e'] = self.earn
        context['c'] = self.cost
        context['title'] = self.title
        return context
class AddErn(Common, CreateView):
    template_name = "add.html"
    success_url = "/earnings/"
    category_list = Category.objects.filter(operation_type=1)
    earn = True
    title = u'Ввод доходов'
class EditEarn(Common, UpdateView):
    # Todo something



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version