Переписать представление на основе функций в представление на основе классов
Я пытаюсь переписать свое приложение 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
надеюсь, кто-нибудь поможет мне прояснить ситуацию, спасибо