#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)