You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django CBV与FBV互转求助:含Paystack支付的视图转换问题

FBV 转 CBV(Paystack 租车详情视图)
from django.views.generic import DetailView
from django.contrib import messages
from django.conf import settings
from .models import CarRent
# 导入你项目中自定义的PaystackAccount类

class CarRentDetailView(DetailView):
    model = CarRent
    template_name = 'app/CarRent_detail.html'
    context_object_name = 'object'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 初始化Paystack配置
        paystack = PaystackAccount(
            settings.PAYSTACK_EMAIL,
            settings.PAYSTACK_PUBLIC_KEY,
            self.object.total_cost
        )
        # 注入原FBV中的额外上下文参数
        context.update({
            'pk_public': settings.PAYSTACK_PUBLIC_KEY,
            'currency': 'NGN',
            'paystack': paystack
        })
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        paystack = PaystackAccount(
            settings.PAYSTACK_EMAIL,
            settings.PAYSTACK_PUBLIC_KEY,
            self.object.total_cost
        )
        # 原有支付验证逻辑保持不变
        if paystack.verify_transaction(request.POST['reference']):
            messages.success(request, "payment successfull")
            …
            car_rented.save()
            …
            rent_activation.save()
            messages.success(request, "Rent successfully updated")
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)
CBV 转 FBV(选手投票详情视图)
from django.shortcuts import get_object_or_404, render, redirect
from django.contrib import messages
from django.urls import reverse
from .models import Contestant
from .forms import VoteForm

def contestant_detail(request, pk):
    # 获取当前选手对象
    contestant = get_object_or_404(Contestant, pk=pk)
    # 处理表单提交请求
    if request.method == 'POST':
        form = VoteForm(request.POST)
        if form.is_valid():
            # 原有业务逻辑保持不变
            …
            contestant.save()
            messages.success(request, f'You have successfully casted {vote_count} vote.')
            # 提交成功后重定向到原详情页
            return redirect(reverse('contest:contestant-detail', kwargs={'pk': pk}))
    # 处理普通GET请求
    else:
        form = VoteForm()
    # 组装对应上下文参数
    context = {
        'contestants': contestant,
        'vote_contestant': contestant,
        'form': form
    }
    return render(request, 'contest/contestant_detail.html', context)

内容的提问来源于stack exchange,提问作者Abdul Giwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:45:01