преобразование CBV в FBV

#django #django-views #django-forms

Вопрос:

Я пытаюсь изменить все мое представление, основанное на функциях, на представление, основанное на классах, я довольно успешно, за исключением этого представления, это подробное представление, содержащее платежный шлюз paystack. Любая помощь будет чрезвычайно признательна.

 def car_rent_detail_view(request, pk):
    object = get_object_or_404(CarRent, id=pk)

    paystack = PaystackAccount(
        settings.PAYSTACK_EMAIL,
        settings.PAYSTACK_PUBLIC_KEY,
        object.total_cost
    )

    context = {'object': object, 'pk_public': settings.PAYSTACK_PUBLIC_KEY, 'currency': 'NGN', 'paystack': paystack,
               }
    if request.method == 'POST':
        if paystack.verify_transaction(request.POST['reference']):
            messages.success(request, "payment successfull")
            …
            car_rented.save()
            …
            rent_activation.save()
            messages.success(request, "Rent successfully updated")


    return render(request, 'app/CarRent_detail.html', context=context)
 

Я хотел бы преобразовать приведенный ниже CBV в FBV, чтобы добавить к нему платежные функции.

 class ContestantDetail(DetailView, FormMixin):
    model = Contestant
    context_object_name = 'contestants'
    template_name = 'contest/contestant_detail.html'
    form_class = VoteForm

    def get_success_url(self):
        return reverse('contest:contestant-detail', kwargs={'pk': self.object.pk})

    def get_context_data(self, *args, **kwargs):
        context = super(ContestantDetail, self).get_context_data(*args, **kwargs)
        context['vote_contestant'] = Contestant.objects.get(pk=self.kwargs.get('pk'))
        return context

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        self.object = self.get_object()

        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form, *args, **kwargs):
        contestant = Contestant.objects.get(pk=self.kwargs['pk'])
        ...
        contestant.save()

        messages.success(self.request, f'You have successfully casted {vote_count} vote.')
        return super().form_valid(form)
 

Комментарии:

1. На первый взгляд, это не представление, для которого существует аналог представления на основе классов. Обычно представления на основе классов используются для простых представлений, которые в противном случае каждый раз повторяли бы стандартный код. Но если представление не вписывается в одно из представлений на основе классов, рекомендуется использовать представление на основе функций.

2. Спасибо, что сообщили мне об этом, моя проблема сейчас в том, что у меня есть подробное представление на основе классов, в которое мне нужно добавить способ оплаты, преобразование обратно в FBV для функциональности оплаты будет сложным, я отредактирую свой вопрос, если все в порядке.

Ответ №1:

Представление на основе классов выше может быть преобразовано в представление на основе функций, как показано ниже.

 def contestant_detail_view(request, pk):
    get_object_or_404(Contestant, pk=pk)
    form = VoteForm()

    context = {'contestants': get_object_or_404(Contestant, pk=pk),
               'vote_contestant': Contestant.objects.get(pk=pk),
               'form': form}

    if request.method == 'POST':
        form = VoteForm(request.POST)
        if form.is_valid():
            con = Contestant.objects.get(pk=pk)
            ...
            con.save()

    else:
        form = VoteForm()

    return render(request, 'contest/contestant_detail.html', context)