django - 将 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)
解决方案
上面的基于类的视图可以转换为基于函数的视图,如下所示。
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)
推荐阅读
- java - Java Lambda 函数在连接到 Informix DB 时超时
- typescript - 参数类型 Event 不可分配给参数类型 Event & DragEvent
- java - Java 8:输入功能接口列表并在 .stream() 之后动态调用它们
- java - java.lang.ClassCastException:类 org.springframework.security.core.userdetails.User 不能强制转换为类
- android - android studio保存最后选择的背景图片
- bash - 如何仅在会话期间将远程服务器的登录 shell 切换为 bash?
- sql - 从下面的查询中列出管理至少两名员工的老板的姓氏
- javascript - Fabric.js - 图像质量差
- json - 在flutter中访问quicktype JSON对象
- python - 如何使用 selenium 从 CSV 文件中打开 URL?