Найти - Пользователи
Полная версия: CBV
Начало » Django » CBV
1
balalay12
Всем привет. Начал осваивать 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) т.к. код там идентичен.
FishHook
Не нужно привязывать базовый класс к конкретному дженерику, посмотрите как это сделано в джанге - там юзаются миксины (примеси). То есть ваш код будет выглядеть как то так
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
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