首页 > 解决方案 > 将 CBV 转换为 FBV

问题描述

我正在尝试将所有基于函数的视图更改为基于类的视图,除了这个视图之外,我已经相当成功,它是一个包含支付堆栈支付网关的详细视图。任何帮助将不胜感激。

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)

标签: djangodjango-viewsdjango-forms

解决方案


上面的基于类的视图可以转换为基于函数的视图,如下所示。

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)

推荐阅读