Переписать представление на основе функций в представление на основе классов

Я пытаюсь переписать свое приложение Django, чтобы оно использовало Django Rest Framework, но мне нужна небольшая помощь, чтобы понять, как мне переписать функцию представления post в представление на основе классов.

сначала у меня есть представление на основе функций, которое я хотел бы переписать:

def make_transfer(request):
    assert not request.user.is_staff, 'Staff user routing customer view.'
    if request.method == 'POST':
        form = TransferForm(request.POST)
        form.fields['debit_account'].queryset = request.user.customer.accounts
        if form.is_valid():
            amount = form.cleaned_data['amount']
            debit_account = Account.objects.get(pk=form.cleaned_data['debit_account'].pk)
            debit_text = form.cleaned_data['debit_text']
            credit_account = Account.objects.get(pk=form.cleaned_data['credit_account'])
            credit_text = form.cleaned_data['credit_text']
            try:
                transfer = Ledger.transfer(amount, debit_account, debit_text, credit_account, credit_text)
                return transaction_details(request, transfer)
            except InsufficientFunds:
                context = {
                    'title': 'Transfer Error',
                    'error': 'Insufficient funds for transfer.'
                }
                return render(request, 'BankApp/error.html', context)
    else:
        form = TransferForm()
    form.fields['debit_account'].queryset = request.user.customer.accounts
    context = {
        'form': form,
    }
    return render(request, 'BankApp/make_transfer.html', context)

Форма TransferForm выглядит следующим образом:

class TransferForm(forms.Form):
    amount  = forms.DecimalField(label='Amount', max_digits=10)
    debit_account = forms.ModelChoiceField(label='Debit Account', queryset=Customer.objects.none())
    debit_text = forms.CharField(label='Debit Account Text', max_length=25)
    credit_account = forms.IntegerField(label='Credit Account Number')
    credit_text = forms.CharField(label='Credit Account Text', max_length=25)

    def clean(self):
        super().clean()

        # Ensure credit account exist
        credit_account = self.cleaned_data.get('credit_account')
        try:
            Account.objects.get(pk=credit_account)
        except ObjectDoesNotExist:
            self._errors['credit_account'] = self.error_class(['Credit account does not exist.'])

        # Ensure positive amount
        if self.cleaned_data.get('amount') < 0:
            self._errors['amount'] = self.error_class(['Amount must be positive.'])

        return self.cleaned_data

Я старался изо всех сил, но я не уверен, как вернуть контекст 'form', потому что кажется, что представление на основе класса полагается на модель, но форма, которую я пытаюсь использовать, не имеет прямой модели - надеюсь, я хоть что-то понял..

В try/catch я использую модель Ledger для вызова созданной мной функции Ledger.transfer, так что я должен использовать именно LedgerSerializer?

class make_transfer(generics.ListCreateAPIView):
    renderer_classes = [JSONRenderer, TemplateHTMLRenderer]
    template_name = 'BankApp/make_transfer.html'
    serializer_class = TransferFormSerializer # <---
    permissions_classes = [permissions.IsAuthenticated, ]
    #form = TransferForm()
    
    def post(self, request):
        assert not request.user.is_staff, 'Staff user routing customer view.'

        form = TransferForm(request.POST)
        form.fields['debit_account'].queryset = request.user.customer.accounts
        if form.is_valid():
            amount = form.cleaned_data['amount']
            debit_account = Account.objects.get(pk=form.cleaned_data['debit_account'].pk)
            debit_text = form.cleaned_data['debit_text']
            credit_account = Account.objects.get(pk=form.cleaned_data['credit_account'])
            credit_text = form.cleaned_data['credit_text']
            try:
                transfer = Ledger.transfer(amount, debit_account, debit_text, credit_account, credit_text)
                return transaction_details(request, transfer)
            except InsufficientFunds:
                context = {
                    'title': 'Transfer Error',
                    'error': 'Insufficient funds for transfer.'
                }                
                return Response({'error': context})
    
    def get_queryset(self):
        form = TransferForm()
        form.fields['debit_account'].queryset = self.request.user.customer.accounts
        context = {
            'form': form,
        }
        return context

надеюсь, кто-нибудь поможет мне прояснить ситуацию, спасибо

Вернуться на верх